导语MySql查询缓存机制是Mysql数据库的重要机制之一,本文将对其缓存机制进行较为深入的分析。
1. MySql查询缓存
MySql缓存主要指的是查询缓存-Query Cache,会缓存执行的sql文本及查询结果集。当运行相同的sql语句时,服务器直接从缓存中获取查询结果,而不再去解析和执行对应的sql。
Query Cache 的具体实现类似KV存储,将select语句和该查询语句的结果集作一个hash映射并保存在一定的内存区域中。Query Cache的查询逻辑:
客户端发起SQL查询 —> 对SQL进行相应的权限验证 —-> 通过Query Cache查询命中。这个过程不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生同任何存储引擎的交互,减少了大量的磁盘IO和CPU运算,所以有时候效率非常高。但是当表更改了(表中任何数据或是结构的改变,包括INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询),那么这个表的所有缓存查询将不再有效,查询缓存值得相关条目也会被清空。因此,对于频繁更新的表,查询缓存是不合适的,而对于一些不常改变但有大量相同sql查询的表,查询缓存会节约很大的性能
2. Query Cache的设置参数
通过调整Mysql查询缓存的参数可以设置Query Cache的功能和性能,主要包括6个参数:
-> show variables like ‘%query _ cache%’;have_ query_cache: 查询缓存是否可用
query _ cache _limit: 允许缓存的单条查询结果集的最大容量,默认是1MB,超过此参数设置的查询结果集将不会被缓存
query cache size: 设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数;
query cache type: OFF关闭 ; ON 开启;Demand 开启Query Cache 功能,但是只有当SELECT语句中使用了SQL _ CACHE 提示后,才使用Query Cache
query cache wlock _ invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的Query Cache。
query cache min res unit:设置查询缓存Query Cache每次分配内存的最小空间大小,即每个查询的缓存最小占用的内存空间大小
判定是否采用缓存查询,可以使用MySql语句查看:
->show status like ‘Qcache hits’;
Qcache hits表示sql查询在缓存中命中的累计次数,是累加值
设置缓存内存,可以使用MySql语句:
mysql> set global query cache size = 600000; –设置缓存内存
开启缓存查询,可以使用MySql语句:
mysql> set session query _ cache _type = ON; –开启查询缓存
3. Query Cache的性能分析 对于某些写频繁的系统,开启Query Cache功能可能并不能让系统性能有提升,有时反而会有下降。
MySql为了保证Query Cache缓存的内容和实际数据绝对一致,当某个数据表发生了更新、删除及插入操作,MySql都会强制使所有引用到该表的查询SQL的Query Cache失效。对于密集写操作,启用查询缓存后很可能造成频繁的缓存失效,间接引发内存激增及CPU飙升,对已经非常忙碌的数据库系统这是一种极大的负担。
4. Query Cache实现差异 Query Cache因MySql的存储引擎不同而实现略有差异,比如MyISAM,缓存的结果集存储在OS Cache中,而最流行的InnoDB则放在Buffer Pool中。