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则表示不允许

查询缓存一些调优方式和流程:
Mariadb 查询缓存

查询状态的相关变量

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:有多少内存块

相关文章: