本文共 3645 字,大约阅读时间需要 12 分钟。
写在前面:
query cache 适合查询多的环境,生产环境所需要的query cache并不是很大,一般256MB就足够了。对于写操作很频繁的应用,可以考虑禁用query cachemysql query cache优化query cache原理
当mysql接收到一条select类型的query时,mysql会对这条query进行hash计算而得到一个hash值,然后通过该hash值到query cache中去匹配,如果没有匹配中,则将这个hash值存放在一个hash链表中,同时将query的结果集存放进cache中,存放hash值的链表的每一个hash节点存放了相应query结果集在cache中的地址,以及该query所涉及到的一些table的相关信息;如果通过hash值匹配到了一样的query,则直接将cache中相应的query结果集返回给客户端。如果mysql任何一个表中的任何一条数据发生了变化,便会通知query cache需要与该table相关的query的cache全部失效,并释放占用的内存地址。query cache优缺点
优点很明显,对于一些频繁select query,mysql直接从cache中返回相应的结果集,而不用再从表table中取出,减少了IO开销。即使query cache的收益很明显,但是也不能忽略它所带来的一些缺点:合理利用query cache
query cache有利有弊,合理的使用query cache可以使其发挥优势,并且有效的避开其劣势。mysql> show variables like '%query_cache%';
+------------------------------+----------+| Variable_name | Value |+------------------------------+----------+| have_query_cache | YES || query_cache_limit | 1048576 || query_cache_min_res_unit | 4096 || query_cache_size | 16777216 || query_cache_type | ON || query_cache_wlock_invalidate | OFF |+------------------------------+----------+6 rows in set (0.00 sec)mysql> show global status like '%Qcache%%';
+-------------------------+---------+| Variable_name | Value |+-------------------------+---------+| Qcache_free_blocks | 824 || Qcache_free_memory | 6879952 || Qcache_hits | 4841 || Qcache_inserts | 162886 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 659368 || Qcache_queries_in_cache | 2428 || Qcache_total_blocks | 5777 |+-------------------------+---------+8 rows in set (0.00 sec)have_query_cache 表示是否支持query cache;
query_cache_limit 表示query cache存放的单条query最大结果集,默认值为1M,结果集大小超过该值的query不会被cache;query_cache_min_res_unit 表示query cache 每个结果集存放的最小内存大小,默认4k;query_cache_size 表示系统中用于query cache的内存大小;query_cache_type 系统是否打开了query cache功能;query_cache_wlock_invalidate 针对myisam存储引擎,设置当有write lock在某个table上面的时候,读请求是要等待write lock释放资源之后再查询还是允许直接从query cache中读取结果,默认是OFF,可以直接从query cache中取得结果。以上参数经常需要调整的是“query_cache_limit”和“query_cache_min_res_unit”,都需要根据业务做一些调整,比如cache的结果集大都小于4k的话,可以适当的调整"query_cache_min_res_unit"的值,以避免造成内存的浪费。如果结果集的大小又都大于1M时,就得调整"query_cache_limit"的值,避免因为结果集大小超过限制而不被mysql cache住。查看query cache相关的状态变量
Qcache_free_blocks 表示query cache中目前还有多杀剩余的blocks,如果该值显示较大,则说明query cache中的内存碎片较多,需要进行整理了;
Qcache_free_memory 表示query cache目前剩余的内存大小;Qcache_hits 表示query cache有多少次命中;Qcache_inserts 表示未命中cache后将结果集再写入到cache中的次数;Qcache_lowmem_prunes 表示多少条query因为内存不足而被清除出query_cache;Qcache_not_cached 表示因为query_cache_type的设置或者不能被cache的query的数量;Qcache_queries_in_cache 表示当前cache的query的数量;Qcache_total_blocks 当前query cache中的block数量。通过上述这些状态变量可以了解到query cache的运行状况,从而可以调整相应的系统参数的值。query cache的限制转载于:https://blog.51cto.com/fzhddn/2052792