1、MySQL Query Cache

query cache是MySQL数据库用于缓存select语句以及语句的结果集。该缓存在技术细节上类似键值对存储,将select语句和语句的查询结果集做了一个hash映射并保存在一定的内存区域中。当客户端发起sql查询时,query cache的查找逻辑是:先对sql进行相应的权限验证,接着通过query cache查找结果。它不需要经过Optimizer模块进行执行计划的分析优化,也不需要发送同任何存储引擎的交互,减少了大量的磁盘IO和CPU运算,所以有时候效率非常高。

2、 设置参数

可以通过调整MySQL的配置(通常在/etc/my.cnf)来设置query cache,主要有5个参数:

query_cache_limit

允许缓存的单条查询结果集的最大容量,默认是1MB,超过此参数设置的查询结果集将不会被缓存

query_cache_min_res_unit

设置查询缓存query cache每次分配内存的最小空间大小,即每个查询的缓存最小占用的内存

query_cache_size

设置query cache所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是,MySQL会自动调整降低最小量以达到1024的倍数

query_cache_type

控制query cache功能的开关,有0、1、2三种模式

0:关闭缓存,任何情况都不使用缓存

1:开启缓存,但是当select语句中使用sql_no_cache时,不使用缓存

2:开启缓存,但是只有当select语句中使用sql_cache时,才使用缓存

query_cache_wlock_invalidate

控制当有写锁定发生在表上的时刻是否先失效该表相关的Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的Query Cache。

3、Query Cache和性能

开启Query Cache功能可能并不能让系统性能有提升,有时反而会有下降。原因是MySql为了保证Query Cache缓存的内容和实际数据绝对一致,当某个数据表发生了更新、删除及插入操作,MySql都会强制使所有引用到该表的查询SQL的Query Cache失效。对于密集写操作,启用查询缓存后很可能造成频繁的缓存失效,间接引发内存激增及CPU飙升,对已经非常忙碌的数据库系统这是一种极大的负担。

4、其他

Query Cache因MySql的存储引擎不同而实现略有差异,比如MyISAM,缓存的结果集存储在OS Cache中,而最流行的InnoDB则放在Buffer Pool中。