MySQL之查询缓存优化
一 概述
开启MySQL的查询缓存,当执行完全相同的SQL语句时,服务器就会直接从缓存中获取结果,当数据修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存。
二 操作流程
1 客户端发送一条查询SQL给服务器;
2 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果,否则进入下一阶段
3 服务器对SQL进行解析、预处理,再由优化器生成对应的执行计划;
4 MySQL根据执行计划调用存储引擎的API执行查询
5 将结果返回给客户端,并将结果放到缓存中
流程图如下:
三 查询缓存参数配置
1 查看当前MySQL数据库是否支持查询缓存
SHOW VARIABLES LIKE 'have_query_cache';
2 查看当前MySQL数据库是否开启了查询缓存
SHOW VARIABLES LIKE 'query_cache_type';
3 查看查询缓存的占用大小
SHOW VARIABLES LIKE 'query_cache_size';
4 查看查询缓存的状态变量
SHOW STATUS LIKE 'Qcache%';
各个变量的含义如下:
四 开启查询缓存
MySQL查询缓存默认是关闭的,需要手动配置query_cache_type,它的参数有以下三个:
在/usr/my.cnf配置文件中,增加以下配置:
#开启MySQL的查询缓存
query_cache_type = 1;
配置完保存后需要重启MySQL服务器采用生效。
五 查询缓存的SELECT选项
1 SQL_CACHE:如果重新结果是可缓存的,并且query_cache_type系统变量的值为ON或DEMAND,则 缓存查询结果
2 SQL_NO_CACHE:服务器不使用查询缓存,既不检查查询缓存,也不检查是否缓存,也不缓存查询结果
案例:
SELECT SQL_CACHE id,name FROM customer;
SELECT SQL_NO_CACHE id,name FROM customer;
六 查询缓存失效情况
1 SQL语句不一致的情况,想要命中查询缓存,查询的SQL语句必须一模一样
案例:
select count(*) from t_user;
Select count(*) from t_user;
2 当查询语句中有一些不确定的值时:如now(),current_date(),curdate(),curtime(),rand(),uuid(),user(),database()
案例:
select * from t_user where updatetime < npw() limit 1;
select user();
select database();
3 不使用任何表查询语句
案例:
select 'A';
4 查询mysql,information_schema,performance_schema数据库中的表时,不会走查询缓存
select * from information_schema.engines;
5 在存储的函数,触发器或事件的主体内执行的查询
6 如果表更改,则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。这包含使用merger映射到已更改表的查询。若表被改变INSERT, UPDATE, DELETE, TRANCATE TABLE, ALTER TABLE, DROP TABLE, DROP DATABASE,存储缓存会失效。