mysql查询缓存

开始—>命中率可以接受—->结束
开始—>命中率不可以接受—->大部分都不是能缓存—->query_cache_limit足够大—->查询结果无法缓存
开始—>命中率不可以接受—->大部分都不是能缓存—->query_cache_limit足够大—->增加query_cache_limit
开始—>命中率不可以接受—->大部分都是能缓存—->发生了很多验证工作—->缓存被碎片化了—–>减小query_cache_min_res_unit值,减少碎片
开始—>命中率不可以接受—->大部分都是能缓存—->发生了很多验证工作—->缓存未被碎片化了—–>有很多因为内存过低的修复工作—->增加query_cache_size
开始—>命中率不可以接受—->大部分都是能缓存—->未发生很多验证工作—->缓存已经启动—->从未见过该查询
开始—>命中率不可以接受—->大部分都是能缓存—->未发生很多验证工作—->缓存未启动—->启动缓存

1、查询缓存在大多数的场景中都是适用的,但是在数据经常发生变化的情况下,当数据在随时变化情况下不适用,反而会降低性能,因为缓存还未命中数据就已经发生了变化,数据变化就会重新生成缓存,造成性能下降。创建回收会带来额外消耗。
2、查询缓存的大小,它并不是越大越好反而会成为瓶颈,因为现在服务器的性能越来越强,核心数会越来越多,同一台服务器可以同时执行多条mysql查询,那么每个查询缓存就成为了热点,每个cpu核心所抢占的资源,这样如果查询缓存过大,会成为性能瓶颈。所以一般mysql的查询缓存默认为16m,所以我们在实际使用中查询缓存几十兆就好了。
如何判断是否命中:
通过查询语句的hash值判断:哈希值考虑的因素包括:
查询本身、要查询的数据库、客户端协议版本,…..
查询语句任何字符上的不同,都会导致缓存不能命中;大小写hash都会影响;使用同一种编码习惯。
那些查询可能不会被缓存?
查询中包含UDP、存储函数、用户自定义变量、临时表、mysql库中系统表、或者包含列级别权限的表、有着不确定值得函数(now())。
是否受益大于开销。

MariaDB [mysql]> 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 | localhost-slow.log |
+——————————+——————–+
14 rows in set (0.01 sec)

MariaDB [mysql]>

query_cache_min_res_unit 4096 缓存最小结果集,也就是说小于4k就不予缓存的。分配内存最小单位
query_cache_min_res_unit:查询缓存中内存块的最小分配单位;
较小值会减少浪费,但会导致内存更频繁的内存分配操作;
较大值会带来浪费,会导致碎片过多;
查询大平均值;

query_cache_limit | 1048576
query_cache_limit:能够被缓存的最大查询结果;
查询一开始就开始尝试缓存数据,当达到了缓存最大值,就会清除开始缓存的结果。
对于有着较大结果的查询语句,建议在SELECT 中使用SQL_NO_CACHE

query_cache_size | 0 |
query_cache_size:查询缓存共可用的内存;单位字节,必须是1024的整数倍;

query_cache_type ON| OFF | DEMAND
为’ON’是表示,查询缓存是打开的;’SELECT’ 复合缓存条件的就缓存,否则不予缓存;显示’SQL_NO_CACHE’不予缓存;
为’DEMAND’是表示查询缓存是按需进行的;显示指定’SQL_CACHE’是才会缓存,否则不予缓存;

query_cache_wlock_invalidate | OFF
query_cache_wlock_invalidate:如果某个数据被其它的连接锁定,是否任然可以从查询缓存中返回数据结果。默认是off,表示可以在表被其它连接锁定的情况下,继续从缓存返回数据。on为不允许。

查询相关变量的方式:
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 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+————————-+——-+
8 rows in set (0.00 sec)

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘Com_se%’;
+—————-+——-+
| Variable_name | Value |
+—————-+——-+
| Com_select | 27 |
| Com_set_option | 0 |
+—————-+——-+
2 rows in set (0.00 sec)

缓存命中率的评估:
Qcache_hits/(Qcache_hits+Com_select)

Qcache_free_blocks:空闲的内存块,预先很多个缓存块,或者上次使用后没有回收的。
Qcache_free_memory:任然空闲的内存空间;
Qcache_inserts:向缓存中插入查询结果,把可缓存的查询语句的结果,放入缓存的次数
Qcache_lowmem_prunes:有多少次因为查询缓存内存空间太少,而不得不利用lru来清理缓存空间的,此值过大通常是因为query_cache_size空间太小。
Qcache_not_cached:可缓存任然未被缓存的结果
Qcache_queries_in_cache:在当前的缓存空间中被缓存下来的查询的个数,比如16个内存空间能够缓存1000个查询,如果满了的话,这里就该是1000个
Qcache_total_blocks:整个查询空间一共有多少个内存块,是内存区段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值