query_cache 读者摘要:
http://blog.csdn.net/qiuyepiaoling/article/details/6004611
1、query_cache是server的查询缓存,跟存储引擎无关。当然存储引擎层也有查询缓存。
2、query_cache缓存的VALUE是“结果集”,而不是“页”。KEY是SQL语句,取HASH,如果SQL中含有子查询,也是作为整体Cache,而不会按子查询分别Cache。
3、内存与磁盘的读写速度差异是千倍级。直观的说:宁愿在内存中执行1000次,不要在磁盘上执行一次。
4、query_cache提高查询效率的2个原因:(1)内存读写性能比磁盘好;(2)缓存命中时,减少了SQL解析和优化时间。
5、失效机制: 一个表的任何修改,都会促使涉及这个表的所有query cache失效。 这个机制不合理,因为不是所有的表更新都会改变SQL的结果集。但是这个机制实现简单。
6、query_cache的配置和统计:
(1)设置: SHOW VARIABLES LIKE '%query_cache%';
(2)统计: show status like 'Qcache%' ;
(3)内存管理:query_cache的内存管理也是按块分配,不是按需分配,因此当需要1.8块的时候,要占2块,导致出现内部碎片(mysql的flush query cache是碎片整理工具,碎片整理期间,所有的Cache都会被锁住禁用)。query_cache也是指定总池子大小,如果池子满了,则会进行“驱逐”。
7、即使query_cache开关打开了,也有不执行cache的情况发生:
(1)SQL包含不确定函数,比如current_date 或 rand(随机数)等。
(2)结果集太大,超过了query_cache_limit的大小,默认数值是1M。
(3)query_cache总内存空间不够,新的会被缓存,老的会被驱逐。
(4)在SQL语句上明确用SQL_NO_CACHE指定不缓存。
8、运维关键
SHOW VARIABLES LIKE '%query_cache%';
query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache
“值大小限制”: Value大小限制,结果集默认不能超过1M,超过1M的不给于缓存。跟Memcached类似。
query_cache_min_res_unit:设置 Query Cache 中每次分配内存的最小空间大小,也就是每个 Query 的 Cache 最小占用的内存空间大小,默认4KB,要设置合理,不然会造成碎片过多,造成内存的浪费。
“块大小”:默认4K。不是4K的整数倍的内存需求,需要向上取整分配,因此产生内部碎片。
query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数
“总大小”:query_cache的总大小,因为mysql是自己管理内存的,query_cache_size是mysql从操作系统批发来的总内存大小。query_cache在这个范围内分配,如果超过这个范围,就开始驱逐。
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。默认false (这个开关没太理解什么意思)
----
show status like 'Qcache%' ;
query_cache_size: “总内存”大小。
Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量 (空闲内存大小)
Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目 (“空闲块数量”)
Qcache_total_blocks:Query Cache 中总的 Block 数量 (“总块数量”)
Qcache_hits:Query Cache 命中次数
Qcache_inserts:向Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量 (缓存池中有多少个Query正被缓存着)
Qcache_lowmem_prunes:Query Cache 因为内存不够,而从中删除老的Query Cache的次数。 (驱逐的个数)
当一次query过来,对于缓存,要么命中,则hits;要么没命中,则为了未来命中,需要向缓存中插入inserts。 当然也有第三种情况:既没有命中缓存,又不插入缓存。 这种情况发生在(1)结果集超过1M;(2)SQL中含有不定值函数,比如current_date 。
Query Cache 命中率= Qcache_hits/(Qcache_hits+Qcache_inserts) ; Query Cache 的大小设置一般不要超过256MB。
如果从查询缓存中返回一个查询结果,服务器把Qcache_hits状态变量的值加一,而不是Com_select变量。