Mariadb查询缓存
查询缓存:
如何判断是否命中?
通过查询语句的哈希值判断,哈希值考虑的因素包括:
查询本身、要查询的数据库、客户端使用协议版本、...
查询语句在字符上有任何的不同,都会导致缓存不能命中
哪些查询不能被缓存?
查询中包括了UDF(User-Define-Function)、存储函数、用户自定义变量、
临时表、mysql库中系统表
或者包含列级别权限的表(不同用户可能查询出来的结果不同)、不确定函数(Now())
查询相关的服务器变量
SHOW GLOBAL VARIABLES LIKE "%query%";
---->
+------------------------------+----------------+
| Variable_name | Value |
+------------------------------+----------------+
| expensive_subquery_limit | 100 |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_strip_comments | OFF |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | node2-slow.log |
+------------------------------+----------------+
query_cache_min_res_unit:查询缓存中内存块最小的分配单位
较小值会减少内存浪费,但会导致频繁的内存分配操作
较大值会带来浪费,会导致碎片过多
query_cache_limit:能缓存的最大查询结果
对着有较大结果的查询语句,建议在SELECT中使用SQL_NO_CACHE
query_cache_size:查询缓存总体占有的内存空间,单位是字节,必须是1024的整数倍
query_cache_type:ON|OFF|DEMAND demand表示只有明确指出SQL-CACHE时才缓存
query_cache_wlock_invalidate:如果某表被其他连接锁定,是否任然从缓存中返回结果;
默认为OFF,表示可以在表被其他连接锁定时继续从缓存中返回数据,ON则表示不允许
查询缓存一些调优方式和流程:
查询状态的相关变量
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 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
Qcache_inserts:可缓存查询语句的结果被写入缓存的次数
Qcache_lowmem_prunes:有多少次是因为我们的查询空间太小,而不得不使用LRU清理缓存的次数
Qcache_not_cached:可缓存却没能缓存
Qcache_queries_in_cache:在当前的缓存空间中,被缓存下来的查询语句的个数
Qcache_total_blocks:有多少内存块
评估缓存命中率:
Qcache_hits/(Qcache_hits+Com_select)