原文: mysql增加缓存的命令,MySQL查询缓存_特不深沉的博客-CSDN博客
一、查询缓存说明
MySQL Query Cache 是用来缓存我们所执行的SELECT语句 以及该语句的结果集, MySql在实现 Query Cache 的具体技术细节上类似典型的KV存储, 就是将 SELECT 语句和该查询语句的结果集做了一个 HASH 映射 并保存在一定的内存区域中。 当客户端发起SQL查询时,Query Cache 的查找逻辑是, 先对SQL进行相应的权限验证, 接着就通过 Query Cache 来查找结果 (注意必须是完全相同的SQL,即使多一个空格或者大小写不同都认为不同, 如果使用不同的字符集、不同的协议等也会被认为是不同的查询而分别进行缓存)。 它不需要经过 Optimizer 模块进行执行计划的分析优化, 更不需要发生同任何存储引擎的交互, 减少了大量的 磁盘IO 和 CPU运算,所以有时候效率非常高。
二、查询缓存命中
判断一个缓存是否被命中,通过查询语句的 HASH 值来判断,
HASH 值因素包括 查询语句、查询数据库、客户端版本协议 等,
如查询语句任何字符的不同,都会导致 HASH 结果的不同,
都可能导致缓存无法命中。
有些查询不能被缓存,如查询中包含 UDF、存储函数、用户自定义变量、
临时表、mysql库中系统表、或者包含 列级权限 的表、
有着不确定值的函数(Now());
查询缓存是完全存储在内存中的,
对整个内存空间分配回收等,
会额外产生系统资源消耗,
这会导致内存碎片的产生。
三、查看查询缓存的参数
-- 查询缓存相关变量
show global variables like '%query_cache%';
query_cache_limit 1048576 query_cache_min_res_unit 4096 query_cache_size 1048576 query_cache_type OFF query_cache_wlock_invalidate OFF
query_cache_min_res_unit: 查询缓存中内存块的最小分配单位; 较小值会减少浪费,但会导致更频繁的内存分配操作; 较大值会带来浪费,会导致碎片过多; query_cache_limit: 能够缓存的最大查询结果; 对于有着较大结果的查询语句, 建议在SELECT中使用 SQL_NO_CACHE query_cache_size: 查询缓存总共可用的内存空间; 单位是字节,是 1024 的整数倍; query_cache_type: 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: 如果某表被其它的连接锁定, 是否仍然可以从查询缓存中返回结果; 默认值为OFF,表示可以 在表被其它连接锁定的场景中 继续从缓存返回数据; ON则表示不允许;
-- 查看缓存变量参数
show global status like 'Qcache%';
Qcache_free_blocks 1 Qcache_free_memory 1031832 Qcache_hits 0 Qcache_inserts 0 Qcache_lowmem_prunes 0 Qcache_not_cached 84 Qcache_queries_in_cache 0 Qcache_total_blocks 1
Qcache_free_blocks: 缓存池中空闲块的个数,空闲的内存块。 Qcache_free_memory: 缓存中空闲内存空间 Qcache_hits: 缓存命中次数 Qcache_inserts: 可缓存查询语句的结果 被放入缓存的次数 Qcache_lowmen_prunes: 有多少次是因为查询缓存内存空间太少 而使用LRU算法清理缓存的次数 Qcache_not_cached: 可缓存却未能缓存的结果, 例如查询结果超出缓存块大小,查询中包含可变函数等 Qcache_queries_in_cache: 当前缓存中缓存的SQL数量 Qcache_total_blocks: 整个查询缓存有多少内存块 缓存命中率: Qcache_hits/(Qcache_hits+Com_select)
四、分析和配置查询缓存流程及提高缓存命中率
①.命中率是否可以接受?
如果可以,就结束。
②.不能接受,大部分查询不可缓存,query_cache_limit足够大吗?
是,就结束,说明查询不能缓存,有可能是用户自定义变量、存储函数等,建议关闭查询缓存。
不是,则说明需要增加 query_cache_limit 值。
③.大部分本可以缓存,却没有被缓存。
是否发生繁重工作?
是,查看缓存是否被碎片化?
是,需要降低 query_cache_min_res_unit 的值
或 flush query cache 命令来整理缓存,减少碎片。
不是因为碎片太多,
则内存过低发生的修正工作?
④.如果是内存过低,则增加 query_cache_size。
如果不是内存过低,是否有频繁的更新语句?
频繁的更新表导致的缓存不能被命中,负载不适合缓存,建议关闭缓存。
没有频繁更新,则其他配置有问题。
⑤.如果没有发生验证工作,缓存启动了?
是,没有过此查询。
否,启动缓存。
相关资源:https://download.csdn.net/download/chinac6iz/5974351?spm=1001.2101.3001.5697