MySQL查询缓存的配置
MySQL查询缓存的配置只有以下5个参数。
可以通过 SET GLOBAL query_cache_limit= 40960 配置查询缓存的参数,但这样设置,重启服务器的时候需要重新配置。也可在MySQL的配置文件my.ini中配置,只需添加自己需要的即可,如query_cache_limit=40960。
使用语句 show variables like '%query_cache%' 查看查询缓存配置情况。
query_cache_type:
是否打开查询缓存。可以设置为OFF,ON,DEMAND。当设置为DEMAND时表示只有查询语句中明确写明SQL_CACHE的语句时才会写入查询缓存,这样的好处是可以灵活的控制需要缓存的数据。
query_cache_size:
查询缓存使用的总内存空间,单位字节。
如何设置:
1.若Qcache_free_memory的值长期比较大,则说明查询缓存的空闲空间比较多,那么我们可以将query_cache_size的值可以适当调小一些。
2.若Qcache_free_memory的值比较小,且Qcache_lowmem_prunes比较大,则说明由于内存不足导致了比较多的缓存结果的删除,那么这时可以适当调高query_cache_size。
query_cache_min_res_unit:
在查询缓存中分配内存时的最小单位。
设置的意义:
设置合适的值可以减少碎片的产生,也可平衡每个数据块的大小和每次存储结果时内存块的申请次数。
如何设置:
这个参数最合适的大小和应用程序的查询结果平均大小直接相关,所以我们可以通过内存的实际消耗(query_cache_size-Qcache_free_memory)除以Qcache_queries_in_cache得出单个查询的平均缓存大小,我们可以通过这个值来调整query_cache_min_res_unit的大小
query_cache_limit:
MySQL能过缓存的最大结果。若查询结果大于这个值,则不会被缓存。
设置的意义:
当查询结果很不均匀的时候,有的很大,有的很小,那么碎片和反复的内存块分配可能无法避免。这个时候我们可以通过设置query_cache_limit,将大的结果不缓存,这样我们可以达到减少碎片的目的(通过影响缓存的平均结果的大小,使得我们可以调整query_cache_min_res_unit为更合适的值,从而减少碎片)。
设置后带来的小问题:
由于MySQL是在查询开始返回结果的时候,就开始申请内存块并逐步的将结果写入内存,而此时无法知道查询结果的大小,直到查询结果大于query_cache_limit的值的时候,MySQL才知道这个结果不能被缓存,那么此时将删除此前的缓存结果。我们知道分配内存块是一个比较慢的操作,这样会带来无用的消耗,那么如何减少这样的消耗呢?若我们知道某个查询结果会大于query_cache_limit,这样我们可以在SQL语句中加上SQL_NO_CACHE,告诉MySQL这个查询结果不需要缓存,从而减少这样的消耗。
query_cache_wlock_invalidate:
如果某个数据表被其它的链接锁住时,是否仍然从查询缓存中返回结果。默认OFF,表示可以从缓存中读取数据。ON表示不会从缓存中读取数据。
MySQL查询缓存的配置非常简单,但是要设置合理的配置,则需要根据查询缓存的实际使用情况来配置。查询缓存的使用情况可以通过 SHOW STATUS LIKE 'qcache%' 语句查看。执行如下图所示:
先来介绍这几个值得含义:
Qcache_free_blocks: 查询缓存内空闲的内存块的数量
Qcache_free_memory: 查询缓存内空闲的内存大小
Qcache_hits: 缓存命中的次数
Qcache_inserts: 缓存写入的次数
Qcache_lowmem_prunes: 由于查询缓存内存不足,从删除老的缓存结果的次数。
Qcache_not_cached:查询没有被缓存的次数。有以下原因会导致查询结果不会被缓存。
1.查询语句包含不确定的函数,如NOW(),自定义函数,变量等都不会被缓存。
2.查询结果大于query_cache_limit的值。
3.对于InnoDB引擎来说,当一个语句在事务中修改了某个表,那么在这个事务提交之前,所有与这个表相关的查询都无法被缓存。
Qcache_queries_in_cache: 当前缓存中的查询数量。也就是说有这么多的查询将结果存储在缓存中。
Qcache_total_blocks: 缓存中块的数量。