MySQL查询缓存

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手动控制缓存

四、对写密集型的应用场景来讲,禁用缓存反而能提升性能

相关文章
相关标签/搜索