MySQL查询缓存mysql
用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会当即返回结果,省去解析、优化和执行等阶段。sql
如何检查缓存?缓存
MySQL保存结果于缓存中:服务器
把SELECT语句自己作hash计算,计算结果为key,查询结果做为value。函数
不会被缓存的数据:性能
查询语句中有一些不肯定数据时,不会缓存,例如NOW(),CURRENT_TIME(),通常来讲,若是查询中包含自定义函数、存储函数、用户变量、临时表、mysql库中系统表、或者任何包含权限的表,通常都不会被缓存。优化
缓存会带来额外开销:spa
一、每一个查询都得先检查是否命中;对象
二、检查结果要先缓存;内存
与缓存相关的变量:
查看缓存变量SHOW GLOBAL VARIABLES LIKE 'query_cache%';
query_cache_limit:单个缓存对象的最大值,超出的不缓存,手动使用SQL_NO_CACHE能够人为避免尝试缓存返回结果超出此参数限定值的语句。
query_cache_min_res_unit:存储缓存的最小内存块;计算方法:(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache
query_cache_size:总空间,单位为字节,大小必须是1024倍数。MySQL启动时,会一次分配并当即初始化这里指定大小的内存空间,这意味着,若是修改此大小,会清空缓存,并从新初始化;
query_cache_type:查询缓存类型;是否开启缓存功能,开启方式有三种{ON|OFF|DEMAND};
DEMAND:意味着SELECT语句明确使用SQL_CACHE选项是才会缓存;query_cache_wlock_invalidate:若是某个数据表被其余用户链接锁住了,是否仍然从缓存中返回结果,OFF表示返回。
如何判断命中率:
SHOW GLOBAL STATUS LIKE 'Qcache%';
Qcache_free_blocks:空闲块数
Qcache_free_memory:空闲空间
Qcache_hits:命中次数
Qcache_inserts:向缓存空间中写入缓存的次数
Qcache_lowmem_prunes:由于内存小,腾出内存的次数
Qcache_not_cached:没被缓存的个数
Qcache_queries_in_cache:在缓存中缓存的插入的查询的个数
Qcache_total_blocks:总块数
碎片整理:FLUSH QUERY_CACHE
清除缓存:RESET QUERY_CACHE
计算命中率:
SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits' OR Variable_name='Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 10 |
| Qcache_hits | 0 |
+---------------+-------+
Qcache_hits/( Com_select+ Qcache_hits)
还须要参考命中和写入的比率,即Qcache_hits/ Qcache_inserts的值,此值若是能大于3:1,则代表缓存也是有效的,能达到10:1,为比较理想的状况。若是命中率很低,比值也徘徊在1:1,那说明缓存没什么卵用,仍是关了吧。
缓存优化思路:
使用缓存时如何可以让缓存命中,提升缓存的有效性:
一、批量写入而非屡次单个写入,这样便可仅一次的影响缓存
二、过大的缓存空间,可能会使大量的缓存失效时致使形成服务器假死,因此缓存空间不宜过大
三、必要时,使用SQL_NO_CACHE手动控制缓存
四、对写密集型的应用场景来讲,禁用缓存反而能提升性能