如何判断缓存是否命中:
通过查询语句的哈希值判断:
哈希值考虑的因素包括: 查询语句本身、要查询的数据库、客户端使用的协议版本等
查询语句任何字符上的不同,都会导致缓存不能命中;
哪些查询可能不会被缓存?
查询中包含自定义函数、存储函数、用户自定义变量、临时表、mysql库中系统表、或者包含列级别权限的表、有着不确定值的函数(NOW());
查询缓存相关的服务器变量:
mysql> SHOW GLOBAL VARIABLES LIKE 'query%';
query_cache_min_res_unit: 查询缓存中内存块的最小分配单位;默认4M 较小的值会减少浪费,但会导致更频繁的内存分配操作; 较大的值会带来浪费,会导致碎片过多; query_cache_limit: 能够缓存的最大查询结果; 对于有着较大结果的查询语句,建议在SELECT中使用SQL_NO_CACHE query_cache_size: 查询缓存总共可用的内存空间;单位是字节,必须是1024的整数倍 query_cache_type: ON, OFF, DEMAND
SQL_CACHE: 显示指定查询结果存储于缓存中 SQL_NO_CACHE: 显示指定查询结果不予缓存 query_cache_type的值为‘ON’时,查询缓存功能打开; SELECT的结果符合缓存条件即会缓存,否则,不予缓存; 显示指定SQL_NO_CACHE,不予缓存 query_cache_type的值为‘DEMAND’时,查询缓存功能按需进行; 显示指定SQL_CACHE的SELECT语句才会缓存;其他均不会缓存
query_cache_wlock_invalidate: 如果某表被其他的连接锁定,是否仍然可以从查询缓存中返回结果; 默认值为OFF,表示可以在表被锁定的情况下继续从缓存返回数据;ON则表示不允许;
mysql缓存命中流程:
查询相关的状态变量:
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Qcache_free_blocks | 0 | 空闲的内存块 | Qcache_free_memory | 0 | 空闲的内存空间 | Qcache_hits | 0 | | Qcache_inserts | 0 | 可缓存的查询语句的结果被放入缓存的次数 | Qcache_lowmem_prunes | 0 | 内存太少而不得不利用LRU去清理缓存的次数 | Qcache_not_cached | 0 | 可缓存却没能被缓存的结果 | Qcache_queries_in_cache | 0 | 当前缓存空间中被缓存下来的查询语句的个数 | Qcache_total_blocks | 0 | 整个查询缓存一共有多少个内存块 +-------------------------+-------+
缓存命中率的评估:
Qcache_hits/(Qcache_hists+Com_select)