MySQL的Query Cache 就是用来缓存和 Query 相关的数据的。缓存客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。将 SELECT 语句和语句的结果作了一个 HASH 映射关系而后保存在必定的内存区域中。
query_cache_limit:容许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此值将不被 Cache
query_cache_min_res_unit:设置Query Cache中每次分配最小内存空间,即每一个Cache占用的最小空间
query_cache_size:设置Query Cache所使用的最大内存,默认值为0,大小必须是1024的整数倍,MySQL 会自动调整下降最小量以达到1024的倍数
query_cache_type:控制Query Cache 的开关,能够设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别以下:
0(OFF):关闭 Query Cache 功能,任何状况下都不会使用 Query Cache
1(ON):开启 Query Cache 功能,可是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache
2(DEMAND):开启 Query Cache 功能,可是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache
query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,若是设置为1(TRUE),则在写锁定时将失效该表相关的全部 Query Cache,若是设置为0(FALSE)则在锁定时仍然容许读取该表相关的 Query Cache
经过Global Status 查看Query Cache的状态:缓存
Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目
Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量
Qcache_hits:Query Cache 命中次数
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
Qcache_lowmem_prunes:当 Query Cache 内存容量不够,须要从中删除老的 Query Cache 以给新的
Cache 对象使用的次数
Qcache_not_cached:没有被 Cache 的 SQL 数,包括没法被 Cache 的 SQL 以及因为 query_cache_type
设置的不会被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量
Qcache_total_blocks:Query Cache 中总的 Block 数量
根据这几个状态能够计算出 Cache 命中率,计算出 Query Cache 大小设置是否足够。ide
关于Query Cache的一些说明:
1)以query请求为对象,不管是否包含多表查询或子查询,都只产生一个cache对象。可是存储方式是HASH结构的映射,因此须要sql语句字符大小写等同样,才能在下次查询时命中。
2)query cache中包含所需结果的结果集,客户端字符集,数据字符集,客户端链接的default database等性能
3)query cache的查找是在客户端权限验证以后,SQL解析以前,减小了语句分析与分析优化,不须要存储引擎的交互,减小了磁盘I/O与CPU运算。效率很是高。
4)为了保证 Query Cache 中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增,修改,删除等,都会使全部引用到该表的 SQL 的 Query Cache 失效。 优化
5)当query cache设置为 1 时,MySQL会对每一个select 语句进行query cache查找,须要消耗资源。对于数据更新频繁的表,会不断失效,形成query cache命中低下,影响性能。spa