查询缓存

如何判断缓存是否命中:

通过查询语句的哈希值判断:
  哈希值考虑的因素包括:     查询语句本身、要查询的数据库、客户端使用的协议版本等

查询语句任何字符上的不同,都会导致缓存不能命中;

哪些查询可能不会被缓存?

查询中包含自定义函数、存储函数、用户自定义变量、临时表、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)

 

posted @ 2021-03-02 11:32  coocoo  阅读(135)  评论(0编辑  收藏  举报