作者:王炜
日期:2021年04月09日
mysql可以对相同的语句的查询结果进行缓存,用户下次再次执行相同select语句的时候如果命中缓存,不会再次解析,会直接返回缓存数据。
我们通过下面命令可以查询当前数据库是否已开启
show variables like '%query_cache%';
必须满足两个条件才是开启状态
1)query_cache_size大于0 ;
2)query_cache_type 等于on
上图由于 query_cache_type为off 表示没有开启。
打开mysql配置文件
/etc/my.cnf
在[mysqld]下面加入两行( 注意一定要加在这个里面,否则不生效),第二行size大小视你的查询情况而定。
query_cache_type=1
query_cache_size=128M
重启mysql服务
service mysql restart
可以看到已经开启成功了
我们先去执行一些查询sql 然后再执行下面命令
show status like '%Qcache%';
可以看到Qcache_hits 值369 代表查询缓存已经生效并且命中369次了。
1) 如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、mysql库中的系统表,其查询结果不会被缓存下来。比如函数NOW()
、CURRENT_DATE()、
CURRENT_USER 、 CONNECION_ID() 会因为返回不同的查询结果而不会被缓存。
2)由于开启了查询缓存,之后在命令行查询sql语句的时候,即使是慢查询语句也可能因为查询的是缓存而导致查询变快,这样在优化sql语句的时候可能会被误导。所以需要在查询的时候 加上SQL_NO_CACHE关键词来避免此次查询不被缓存 "select SQL_NO_CACHE 字段a,字段b from 表c",注意是不被缓存 ,但如果缓存已经存在了 ,就查询的还是缓存内容,需要改变sql语句来避免,如加入空格等方式。
3) 查询缓存也会失效,MySQL的查询缓存系统会跟踪查询中涉及的每个表,如果这些表的数据或结构发生了变化,那么和这张表相关的所有缓存数据都将失效。
4) 并不是所有的情况开启了高速缓存都会带来性能的提升,
当缓存带来的资源节约大于其本身消耗的资源时,才会给系统带来性能提升,这个评估其实是比较困难的。建议优先通过其他nosql数据库来做缓存优化,所以mysql从5.6版本开始并没有默认开启查询缓存机制。
欢迎转载,转载请保留链接: https://www.phpzu.com/article/2021/04/09/975.html