MySql基础

mysql
创建于:2019年07月11日 更新于:2020年03月20日

数据库基础

1.什么是数据库?
数据库:database,存储数据的仓库
数据库:高效的存储和处理数据的介质(介质主要是两种:磁盘和内存)

2.数据库的分类
数据库基于存储介质的不同:进行了分类,分为两类:关系型数据库(SQL)和非关系型数据库(NoSQL:Not Only SQL)

3.不同的数据库阵营中的产品有哪些?
关系型数据库
大型:Oracle,DB2
中型:SQL-SERVER,Mysql等
小型:access等
非关系型数据库:memcached,mongodb,redis(同步到磁盘)

4.两种数据库阵营的区别
关系型数据库:安全(保存到磁盘基本不可能丢失),容易理解,比较浪费空间(二维表)
非关系数据库:效率高,不安全(断电丢失)

关系型数据库
1.什么是关系型数据库?
关系型数据库:是一种建立在关系模型(数学模型)上的数据库
关系模型:一种所谓建立在关系上的模型。关系模型包含三个方面:
数据结构:数据存储的问题,二维表(有行和列)
操作指令集合:所有SQL语句
完整性约束:表内数据约束(字段与字段),表与表之间约束(外键)

2.关系型数据库的设计
关系型数据库:从需要存储的数据需求中分析,如果是一类数据(实体)应该设计成一张二维表:表是由表头(字段名:用来规定数据的名字)和数据部分组成(用来存储的数据单元)
关系型数据库的特点之一:如果表中对应的某个字段没有值(数据),但是系统仍然要分配空间:关系型数据库比较浪费空间

关键字说明
数据库:database
数据库系统:DBS(Database System)是一种虚拟系统,将多种内容关联起来的称呼
DBS=DBMS+DB
DBMS: Database Management System,数据库管理系统,专门管理数据库
DBA:Database Administrator,数据库管理员

行/记录:row/record,本质是一个东西:都是指标中的一行(一条记录),行是从结构角度出发,记录是从数据角度出发
列/字段:column/field,本质是一个东西

SQL
SQL: Structured Query Language,结构化查询语言(数据以查询为主:99%是在进行查询操作)

SQL分为三个部分
DDL:数据定义语言,用来维护存储数据的结构(数据库,表),代表指令:create,drop,alter等
DML:数据操作语言,用来对数据进行操作(数据表中的内容),代表指令:insert,delete,update等,其中DML内容又单独进行了一个分类:DQL(数据查询语言,如select)
DCL:数据控制语言,主要是负责权限管理(用户),代表指令:grant,revoke等

SQL是关系型数据库的操作指令,SQL是一种约束,但不强制,不同的数据库产品可能内部会有一些细微区别

中文数据问题
查看服务器默认的对外处理的字符集
show variables like 'character_set%';

修改服务器认为的客户端数据的字符集为gbk
set character_set_client=gbk;

修改服务器给定数据的字符集为gbk
set character_set_results=gbk;

枚举字符串

枚举:enum,事先将所有可能出现的结果都设计好,实际上存储的数据的数据必须是规定好的数据中的一个。
枚举的使用方式
定义:enum(可能出现的元素列表);
存储:存储数据,只能存储上面定义好的数据
作用
规范数据格式,数据只能是规定数据中的其中一个
节省存储空间,枚举实际存储的是数值而不是字符串本事,按照元素出现的顺序,从1开始编号
原理:枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中);然后在进行数据插入的时候,系统将字符串转换成对应的数字存储,然后在进行数据提取的时候,系统自动将数值转换成对应的字符串显示

主键
主键:primary key,一张表只能有一个字段可以使用对应的键,用来唯一的约束该字段里的数据,不能重复
主键不能更新,只能先删除再增加

集合字符串
集合跟枚举类似:实际存储的是数值,而不是字符串(集合是多选)
集合的使用方式:
定义:set(元素列表)、
使用:可以使用元素列表中的元素(多个),使用逗号分割

Mysql记录长度
mysql中规定:任何一条记录最长不能超过65535个字节(varchar永远达不到理论值)
utf8下varchar的实际顶配:21844字符
gbk下varchar的实际顶配:32766字符

mysql记录中如果任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL(若想释放NULL所占用的字节,必须保证所有的字段都不允许为空)

MySQL中text文本字符串不占用记录长度:额外存储,但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度:10个字节(保存数据的地址以及长度)

索引

索引:系统根据某种算法,将已有的数据(未来可能新增的数据),单独建立一个文件,文件能够实现快速的匹配数据,并且能够快速的找到对应表中的记录。
索引的意义
1.提升数据的效率
2.约束数据的有效性(唯一性等)
增加索引的前提条件:索引本身会产生索引文件(有时候有可能比数据文件大),会非常耗费磁盘空间。

如果某个字段需要作为查询条件经常使用,那么可以使用索引;
如果某个字段需要进行输的有效性约束,也可能使用索引;

Msql中提供了多种索引
1.主键索引:primary key
2.唯一索引:unique key
3.全文索引:fulltext index
4.普通索引:index
全文索引:针对文章内部的关键字进行索引

范式

范式:Normal Format,是一种离散数学中的知识,是为了解决一种数据的存储与优化的问题,保存数据的存储之后,范式能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余

范式是一种分层结构的规范,分为六层,每一层都比上一层更加严格,若要满足下一层范式,前提是满足上一层范式。

Mysql属于关系型数据库,有空间浪费,也是致力于节省存储空间,与范式所要解决的问题不谋而合,所以在设计数据库的时候,会利用到范式来指导设计。
但是数据库不但是要解决空间问题,还要保证效率,范式只为解决空间问题,所以数据库的设计又不可能完全按照范式的要求实现,一般情况下,只有前三种范式需要满足

1NF
第一范式:在设计表存储数据的时候,如果表中设计的短存储的数据,在取出来使用之前还需要而外的处理(拆分),那么说表的设计不满足第一范式,第一范式要求字段的数据具有原子性:不可再分

2NF
第二范式:在数据表设计的过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定,而是依赖主键中的某个字段(主键的部分),存在字段依赖主键的部分的问题,称之为部分依赖,第二范式就是要解决表设计不允许出现部分依赖

解决方案:取消复合主键,使用逻辑主键。

3NF
第三范式:理论上讲,应该一张表中的所有字段都应该依赖主键(逻辑主键代表的是业务主键),如果表设计中存在一个字段,并不是直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键,把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖,第三范式就是要解决传递依赖的问题

解决方案:将存在传递依赖的字段,以及依赖的字段本身单独去除,形成一个单独的表,然后在需要对应的信息的时候,使用对应的实体表的主键加进来

逆规范化
有时候,在设计表的时候,如果一张表中有几个字段是需要从另外的表中去获取信息,理论上讲的确可以获取到想要的数据,但是就是效率低一点。逆规范化会刻意的在某些表中,不去保存另外的主键(逻辑主键),而是直接保存想要的数据信息,这样一来,在查询数据的时候,一张表可以直接提供数据,而不需要多表查询(效率低),但是会导致数据冗余增加

主键冲突
在数据插入的时候,假设主键对应的值已经存在:插入一定会失败
当主键存在冲突的时候(Duplicate key),可以选择性进行处理:更新和替换

主键冲突:更新操作
Insert into 表名[(字段列表:包含主键)]values(值列表) 新值

主键冲突:替换
replace into 表名[(字段列表:包含主键)]values(值列表)

蠕虫复制
蠕虫复制:从已有的数据中去获取数据,然后将数据又进行新增操作:数据成倍的增长
表创建高级操作:从已有表创建新表(复制表结构)
Create table 表名 like 数据库.表名
蠕虫复制:先查出数据,然后将查出的数据新增一遍
Insert into 表名[(字段列表)] select 字段列表/* from 数据表名

蠕虫复制的意义:
1.从已有表拷贝数据到新表中
2.可以迅速的让表中的数据膨胀到一定的数量级:测试表的压力以及效率

更新数据
基本语法:update 表名 set 字段 = 值 [where条件] [limit限制数量]

删除数据
基本语法:delete from 表名 [where条件] [limit限制数量]
如果表中存在主键自增长,那么当删除数据之后,自增长不会还原

Truncate 表名;先删除该表 ,后新增该表

查询数据
完整语法

select [select 选项] 字段列表 [字段别名] * from 数据源 [where 条件子句] [group by子句] [having 子句] [order by 子句] [limit 子句];

select 选项:
select 对查出来的结果的处理方式
All:默认的,保留所有的结果
Distinct:去重,查出来的结果将重复的去除(所有字段都相同)
数据源:
数据的来源,关系型数据库的来源都是数据表,本质上只要保证数据是二维表,最终都可以作为数据源

数据源分为多种:单表数据源,多表数据源,查询语句

单表数据源:select from 表名、
多表数据源:select
from 表1,表2…
子查询:数据的来源是一条查询语句(查询语句的结果是二维表)

where 子句
where 子句:用来判断数据,筛选数据
where子句返回结果:0或者1,0代表false,1代表true

判断条件:
比较运算符:>,<,>=,<=,<>,=, like, between and , in,not in
逻辑运算符:&&(and), ||(or), !(not)
where原理:where是唯一一个直接从磁盘获取数据的时候就开始判断的条件,从磁盘取出一条记录,开始进行where判断,判断的结果如果成立保存到内存,失败直接放弃

Group by 子句

group by :分组的意思,根据某个字段进行分组(相同的放一组,不同的分到不同的组)
基本语法:group by 字段名;
分组的意义是为了统计数据(按组统计:按分组字段进行数据统计)

SQL 提供了一系列统计函数
Count():统计分组后的记录数:每一组有多少记录
Max():统计每组中最大的值
Min():统计每组中最小的值
Avg():统计平均数
Sum():统计和

Count():里面可以使用两种参数:*代表统计记录,字段名代表统计对应的字段(null不统计)
分组会自动排序:根据分组字段:默认升序
group by 字段 [asc\desc] ; 对分组合并之后的整个结果进行排序

多字段分组:先根据一个字段分组,然后对分组后的结果再次按照其它字段分组
group_concat(字段):可以对分组的结果中的某个字段进行字符串连接(保留该组所有的某个字段)

回溯统计: with rollup:任何一个字段分组后都会有一个小组,最后都需要向上级分组进行汇报统计:根据当前分组的字段,回溯统计的时候会将分组字段置空

多字段回溯:考虑第一层分组会有此回溯,第二次分组要看第一次分组的组数,组数是多少,回溯就是多少,然后加上第一层回溯即可

having 子句

having 子句:与where 子句一样:进行条件判断的。
where是针对磁盘数据进行判断,进入到内存之后会进行分组操作,分组结果就需要having来处理。
having 几乎能做where 能做的所有事情,但是where却不能做having能做的很多事情
1.分组统计的结果或者说统计函数都只有having 能够使用
2.having 能够使用字段别名,where 不能,where是从磁盘取数据,而名字只可能是字段名,别名是在字段进入到内存后才会产生

order by 子句
order by:排序,根据某个字段进行升序或者降序,依赖校对集

基本语法:order by 字段名 [asc|desc];asc是升序(默认),desc 是降序
排序可以进行多字段排序:先根据某个字段进行排序,然后排序好的内部,再按某个数据再次进行排序

limit 子句
limit 子句是一种限制结果的语句:限制数量
limit 有两种使用方式:
1.只用来限制长度(数据量):limit 数据量;
2.限制起始位置,限制数量: limit 起始位置(从0开始),长度;

外键
外键:foreign key,外面的键(键不在自己表中),如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键,一张表可以有多个外键
外键要求字段本身必须是一个索引(普通索引),如果字段本身没有索引,外键会先创建一个索引,然后才会创建外键本身
增加外键
外键可以在创建表的时候或者创建表之后增加
创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段)

在新增表之后增加外键:修改表结构
alter table 表名 add[constraint 外键名字] foreign key(外键字段) references 父表(主键字段)

修改外键&删除外键
外键不能修改,只能先删除后新增
联合查询
联合查询:将多次查询(多条select语句),在记录上进行拼接(字段不会增加)
基本语法
多条select语句构成:每一条select语句获取的字段数必须严格一致(但是字段类型无关)
select 语句1 union【选项】 select语句2…
union选项:与select选项一样有两个
1.All:保留所有(不管重复)
2.Distinct:去重(整个重复),默认
意义
1.查询同一张表,但是需求不同:如查询学生信息,男生升高升序,女生身高降序
2.多表查询:多张表的结构是完全一样的,保存的数据(结构)也是一样的

order by使用
在联合查询中order by不能直接使用,需要对查询语句使用括号才行,若要order by生效必须搭配Limit使用,limit使用限定的最大数即可

视图

视图:view,是一种有结构(有行有列)但是没有结果(结构中不真实存放数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源)
创建视图
基本语法
creat view 视图名字 as select 语句;—select语句可以使普通查询;可以是连接查询;可以是联合查询;可以是子查询。
创建单表视图:基表只有一个;创建多表视图:基表来源至少两个

查看视图
查看视图:查看视图的结构
视图是一张虚拟表:表的所有查看方式都适用于视图

使用视图
使用视图主要是为了查询,将视图当做表一样查询即可
视图的执行其实本质就是执行封装的select语句

修改视图
视图本身不可修改,但是视图的来源是可以修改的。
修改视图:修改视图本身的来源语句(select语句)
alter view 视图名字 as 新的select语句

删除视图
drop view 视图名字;

视图意义
1.视图可以节省SQL语句:将一条复杂的查询语句使用视图进行保存,以后可以直接对视图进行操作
2.数据安全:视图操作是主要针对查询的,如果对视图结构进行处理(删除),不会影响基表数据(相对安全)
3.视图往往是在大项目中使用,而且是多系统使用,可以对外提供有用的数据,但是隐藏关键的数据

视图数据操作
视图可以进行数据写操作,但是有很多限制

新增数据
数据新增就是直接对视图进行新增
1.多表视图不能新增数据
2.可以向单表视图插入数据:但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值)字段

删除数据
多表视图不能删除数据
单表视图可以删除数据

更新数据
理论上多表视图和单表视图都可以更新数据
更新限制:with check option ,如果对视图在新增的时候限定了某个字段有限制,那么在对视图进行数据更新操作时系统会进行验证,要保证更新之后数据依然可以被视图查询出来,否则不让更新

视图算法
视图算法:系统对视图以及外部查询视图的select语句的一种解析方式。

视图算法分为三种
1.underfined:未定义(默认的),这不是一种实际使用算法,是一种退推卸责任的算法,告诉系统,视图没有定义算法,系统自己看着办
2.temptable:临时表算法:系统应该先执行视图的select语句,后执行外部查询语句
3.merge:合并算法:系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高)
算法指定:在常见视图的时候
create algorithm=指定算法 view 视图名字 as select 语句
视图算法选择:如果视图的select 语句中会包含一个查询子句(五子句),而且很有可能顺序比外部的查询语句要靠后,一定要使用算法temptable,在其他情况可以不用是定默认即可

linux数据库操作
启动数据库 sudo service mysql start 。
连接数据库 mysql -u root。
新建数据库 CREATE DATABASE <数据库名字>;
查看数据库 show databases;
连接数据库 使用语句 use <数据库名字>。 show tables; 可以查看当前数据库里有几张表
新建数据表 CREATE TABLE 表的名字 ( 列名a 数据类型(数据长度), 列名b 数据类型(数据长度), 列名c 数据类型(数据长度) );
插入数据 INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3)

数据的备份与还原
数据备份还原的方式有很多种:数据表备份,单表数据备份,SQL备份,增量备份
SQL备份
备份:mysql没有提供备份指令,需要利用mysql提供的软件:mysqldump.exe
mysqldump.exe也是一种客户端,需要操作服务器,必须连接认证
mysqldump/mysqldump.exe -hPup 数据库名称 [数据表名字1 [数据表名字2…]] > 备份路径(建议使用.sql)
SQL还原
方案一:使用mysql.exe客服端还原
mysql.exe/mysql -hPup 数据库名称 < 备份文件路径
方案二:使用SQl指令还原
source 备份文件所在路径;

事务安全

事务:一系列要发生的连续的操作
事务安全:一种保护连续操作同时满足(实现)的机制
事务操作
事务操作分为两种:自动事务(默认的),手动事务
手动事务:操作流程
1.开启事务,告诉系统以下所有的操作(写)不要直接写入到数据表,先存放到事务日志
start transaction;
2.进行事务操作:一系列操作
3.关闭事务:选择性的将日志文件中操作的结果保存到数据表(同步)或者说直接清空事务日志(原来操作全部清空)
a.提交事务:同步数据表(操作成功):commit;
b.回滚事务:直接清空日志表(操作失败):rollback;
事务原理
事务操作原理:事务开启之后,所有的操作都会临时保存到事务日志,事务日志只有在得到commit命令才会同步到数据表,其他任何情况都会清空事务日志(rollback,断电,断开连接)

回滚点
在某个成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面操作都已经成功,可以在当前成功的位置设置一个点,可以供后续失败操作返回到该位置,而不是返回所有操作,这个点称之为回滚点
设置回滚点:savepoint 回滚点名字;
回到回滚点:rollback to 回滚点名字;
自动事务
在mysql中:默认的都是自动事务处理,用户操作完会立即同步到数据表中
自动事务:系统通过autocommit变量控制
show variables like ‘autocommit’;
关闭自动提交:set autocommit=off/0;
自动提交关闭之后需要手动来选择处理:commit提交,rollback回滚
通常都会使用自动事务
事务特性
事务有四大特性:ACID
A:atomic原子性,事物的整个操作是一个整体,不可分割,要么全部成功,要么全部失败;
C:consistency一致性,事物的前后,数据表中的数据没有变化
I:isolation隔离性,事务操作是相互隔离不受影响的
D:Durability持久性,数据一旦提交,不可改变,永久的改变数据表数据
锁机制:innodb默认是行锁,但是如果在事务操作过程中,没有使用到索引,那么系统会自动全表检索数据,自动升级为表锁
行锁:只有当前行被锁住,别的用户不能操作
表锁:整张表被锁住,别的用户都不能操作

触发器

触发器:trigger,事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码,执行
触发器:事件类型,触发时间,触发对象
1.事件类型:增删改,三种类型insert,delete,update
2.触发时间:前后:before ,after
3.触发对象:表中的每一条记录(行)
一张表中只能拥有一种触发时间的一种类型的触发时间的一种乐行的触发器,最多一张表能有6个触发器
创建触发器
在mysql高级结构中,没有大括号,都是用对应的字符符号代替
触发器基本语法
临时修改语句结束符
—Delimiter 自定义符号:后续代码中只有碰到自定义符号才算结束
—create trigger 触发器名字 触发时间 时间类型 on 表名 for each row
—begin :代表左大括号:开始
—里面就是触发器的内容:每行内容都必须使用语句结束符;分号
—end :代表右大括号:结束
—语句结束符(自定义符号)
将临时语句结束符修改过来
—Delimiter ;
查看触发器
查看所有触发器或者模糊匹配
show triggers[like ‘pattern’];
查看触发器创建语句
show create trigger 触发器名字;
所有的触发器都会保存在一张表中:information_schema.triggers
使用触发器
不需要手动调用,而是当某种情况发生时会自动触发
修改触发器&删除触发器
触发器不能修改,只能先删除,后新增
drop trigger 触发器名称;
触发器记录
不管触发器是否触发了,只要当前某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来,供触发器使用,其中要操作的当前状态保存到old中,操作之后的可能状态保存到new
old代表的是旧记录,new代表的是新纪录
删除的时候没有new;插入的时候没有old
old和new都是代表记录本身,任何一条记录除了有数据,还有字段名字
使用方式:old.字段名 / new.字段名
如果触发器内部只有一条要执行的SQL指令,可以省略大括号(begin,end)
create trigger 触发器名称 触发时间 时间类型 on 表名 for each row 一条SQL指令;
触发器可以和好的协调表内部的数据处理顺序和关系,但是从php角度出发,触发器会增加数据库维护的难度,所以较少使用触发器
代码执行结构
顺序结构,分支结构,循环结构
分支结构
实现准备多个代码块,按照条件选择性执行某段代码
在mysql中只有if 分支
基本语法
if 条件判断 then
—满足条件要执行的代码;
else
—不满足条件要执行的代码;
endif;
循环结构
某段代码在指定条件执行重复执行
while 条件判断 do
—满足条件要执行的代码
—变更循环条件
end while;
循环控制:在循环内部进行循环判断和控制
mysql中没有对应continue和break
iterate:迭代,雷士continue,后面的代码不执行,继续下一次循环
leave:离开,雷士break,整个循环结束
使用方式:iterate/leave 循环名字
—定义循环名字
循环名字 :while 条件 do
—循环体
—循环控制
leve/iterate 循环名字;
end while;

函数

系统函数
任何函数都有返回值,因此函数的调用是通过select 调用
select 函数名;
mysql中字符串的基本操作单位最常见的是字符
substring(目标字符串,截取位置,截取长度);
mysql中字符串的下标从1开始
char_length()
instr()
自定义函数
创建语法
create function 函数名([形参列表 数据类型])returns 数据类型 —规定要返回的数据类型
begin
—函数体
—返回值:return 类型(指定数据类型)
end
查看函数
show function status;
查看函数创建语句
show create function 函数名;
删除函数
drop function 函数名;
存储过程
存储过程简称过程,procedure,是一种用来处理数据的方式
存储过程是一种没有返回值的函数
创建过程
create procedure 过程名字([参数列表])
begin
过程体
end
查看过程
函数的查看方式完全适用于过程:关键字换成procedure
调用过程
过程没有返回值,不能用select调用
call 过程名

缓存

如果使用了QueryCache,当查询接收到一个和之前同样的查询,服务器将会从查询缓存中检索结果,而不是再次分析和执行相同的查询。

打开查询缓存,要通过几个步骤来设置:
虽然你设置mysql允许查询缓存,但是如果你设置的查询缓存大小为了0,这和没有允许没什么区别。
所以必须是几个步骤的设置才能真正打开查询缓存这个功能。
下面演示最常用的设置查询缓存
一、 query_cache_type 使用查询缓存的方式
一般,我们会把 query_cache_type 设置为 ON,默认情况下应该是ON
mysql> select @query_cache_type;
+——————————+
| @query_cache_type |
+——————————+
| ON |
+——————————+
这样 当我们执行 select id,name from tableName; 这样就会用到查询缓存。在 query_cache_type 打开的情况下,如果你不想使用缓存,需要指明selectsql_no_cache id,name from tableName;
当然也可以禁用查询缓存: mysql> set session query_cache_type=off;
当然也可以使用命令打开查询缓存:mysql> set session query_cache_type=on;

二、 系统变量 have_query_cache 设置查询缓存是否可用
mysql> show variables like ‘have_query_cache’;
+—————————+———-+
| Variable_name | Value |
+—————————+———-+
| have_query_cache | YES |
+—————————+———-+
上面的显示,表示设置查询缓存是可用的。
三、 系统变量 query_cache_size
表示查询缓存大小,也就是分配内存大小给查询缓存,如果你分配大小为0,
那么 第一步 和 第二步 起不到作用,还是没有任何效果。
mysql> select @global.query_cache_size;
+—————————————-+
| @global.query_cache_size |
+—————————————-+
| 16777216 |
+—————————————-+
上面是 mysql设置默认的,有的版本好像默认是0的,那么就要自己设置下。
设置 set @global.query_cache_size=100000; 这里是设置1M左右。
再次查看下 select @global.query_cache_size;
显示我们设置新的大小,表示设置成功。
四、 query_cache_limit 控制缓存查询结果的最大值
例如: 如果查询结果很大, 也缓存?这个明显是不可能的。
MySql 可以设置一个最大的缓存值来限制缓存,当你查询缓存数结果数据超过这个值就不会进行缓存。缺省为1M,也就是超过了1M查询结果就不会缓存。
mysql> select @global.query_cache_limit;
+——————————————+
| @global.query_cache_limit |
+——————————————+
| 1048576 |
+——————————————+
这个是默认的数值,如果需要修改,就像设置缓存大小一样设置,使用set重新指定大小。