1、概述
开启Mysql的查询缓存,当执行完全相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存。
如上图所示,MySQL首先尝试查询缓存,缓存未命中时再进行新的SQL查询流程
整体流程如下:
- 客户端发送一条查询给服务器;
- 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;
- 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划;
- MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;
- 将结果返回给客户端。
2、查询配置
查看当前的MySQL数据库是否支持查询缓存
SHOW VARIABLES LIKE 'have_query_cache'
查看当前MySQL是否开启了查询缓存
SHOW VARIABLES LIKE 'query_cache_type'
查看查询缓存的占用大小
SHOW VARIABLES LIKE 'query_cache_size'
查看查询缓存的状态变量
SHOW STATUS LIKE 'Qcache%'
3、设置缓存
MySQL的查询缓存默认是关闭的,需要手动配置参数 query_cache_type , 来开启查询缓存。query_cache_type 该参数的可取值有三个
在 /usr/my.cnf 配置中,增加以下配置 query_cache_type=1开启MySQL查询缓存,重启服务生效
如果是windows缓存,一般修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini文件
可以在SELECT语句中指定两个与查询缓存相关的选项 :
SQL_CACHE : 如果查询结果是可缓存的,并且 query_cache_type 系统变量的值为ON或 DEMAND ,则缓存查询结果 。
SQL_NO_CACHE : 服务器不使用查询缓存。它既不检查查询缓存,也不检查结果是否已缓存,也不缓存查询结果。
SELECT SQL_CACHE id FROM login
SELECT SQL_NO_CACHE id FROM login
4、缓存失效场景
- 查询SQL语句不完全一致
- 查询语句存在now()等不确定值时
- 不使用任何表时
- 查询mysql等数据库信息表时
- 在存储函数、触发器等内执行时
- 表更改时所有该表相关缓存失效