简单说:就是 MySQL 数据库会缓存已经执行过的SQL语句和语句执行结果;如果下次提交同一个SQL语句,就直接反复缓存的执行结果。减少了SQL语句的执行时间。
一、关于查询缓存的问题
不过这个看似简单的实现,牵扯到很多内容
1、哪些SQL语句会被缓存
2、多个会话之间的缓存是否共享?
3、缓存在什么时候会失效?
4、查询缓存命中时,那个阶段检查,会话是否有权限访问查询的数据。
5、如果查询结果的数据量很大,是否还应该缓存。
6、缓存的查询结果,导致内存碎片增多。
……
二、查询缓存问题解答
2.1、查询被缓存的条件
1、查询语句必须完全相同才能被视为相同。查询语句在查询缓存匹配过程使用哈希的方式。
2、使用不同数据库,不同协议版本或不同默认字符集的查询被视为不同的查询,并分别进行缓存。
2.2、查询缓存不缓存哪些语句
1、查询是外部查询的子查询
2、在存储的函数,触发器或事件的主体内执行的查询
3、涉及到用户定义的函数(UDF)或存储函数。
4、涉及到用户变量或本地存储的程序变量。
5、涉及到表mysql, INFORMATION_SCHEMA或 performance_schema数据库。
6、涉及到TEMPORARY表
7、不使用任何表格。
8、用户具有任何涉及表的列级特权。
9、……
2.3、查询缓存的会话共享
查询缓存由会话共享,因此可以发送由一个客户端生成的结果集,以响应另一个客户端发出的相同查询。
2.4、查询缓存中关于用户权限
如果查询语句被缓存命中;在返回查询结构之前,MYSQL会检查用户是否有相应数据库和表的权限。
如果没有相应权限,则不使用缓存的结果返回。
2.5、查询缓存的失效
1、查询缓存不会返回陈旧的数据。当表被修改时,查询缓存中的任何相关条目都被刷新。
2、当缓存的内存不够,而删除部分查询缓存结果。
3、缓存不应该设置在频繁更改的表上。
2.6、对SQL语句设置是否缓存
SQL查询语句执行时,可以指定使用查询缓存或禁用查询缓存。
1、SQL_CACHE:
如果查询结果是可缓存的,并且query_cache_type系统变量的值为ON或KONG,则查询结果将被缓存 DEMAND。
2、SQL_NO_CACHE:
服务器不使用查询缓存。它既不检查查询缓存,查看结果是否已被缓存,也不缓存查询结果。
SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;
更多关于查询缓存的内容,请见:
https://dev.mysql.com/doc/refman/5.7/en/query-cache.html