mysql读缓存区_Mysql的查询缓存区的优化

Mysql的查询缓存区query cache

查看查询缓存区的相关变量:

mysql> SHOW VARIABLES LIKE '%query_cache%';

+------------------------------+----------+

| Variable_name                 | Value     |

+------------------------------+----------+

| have_query_cache             | YES       |

| query_cache_limit             | 1048576   |

| query_cache_min_res_unit     | 4096     |

| query_cache_size             | 33554432 |

| query_cache_type             | ON       |

| query_cache_wlock_invalidate | OFF       |

+------------------------------+----------+

6 rows in set (0.00 sec)

have_query_cache

是否支持查询缓存区 “YES”表是支持查询缓存区

query_cache_limit可缓存的Select查询结果的最大值 1048576 byte /1024 = 1024kB 即最大可缓存的select查询结果必须小于1024KB

query_cache_min_res_unit每次给query cache结果分配内存的大小 默认是 4096 byte 也即 4kB

在这里,我延伸三点重要的东西

1.当查询进行的时候,Mysql把查询结果保存在qurey cache中,但是有时候要保存的结果比较大,超过了query_cache_min_res_unit的值 ,这时候mysql将一边检索结果,一边进行慢慢保存结果,所以,有时候并不是

把所有结果全部得到后再进行一次性保存,而是每次分配一块query_cache_min_res_unit 大小的内存空间保存结果集,

使用完后,接着再分配一个这样的块,如果还不不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中,

mysql要进行多次内存分配的操作,而我们应该知道,频繁操作内存都是要耗费时间的。

2. 内存碎片的产生。当一块分配的内存没有完全使用时,MySQL会把这块内存Trim掉,把没有使用的那部分归还以重复利用。比如,第一次分配4KB,只用 了3KB,剩1KB,第二次连续操作,分配4KB,用了2KB,剩2KB,这两次连续操作共剩下的1KB+2KB=3KB,不足以做个一个内存单元分配, 这时候,内存碎片便产生了。

3.内存块的概念,先看下这个:

mysql> show status like 'qcache%';

+-------------------------+----------+

| Variable_name           | Value     |

+-------------------------+----------+

| Qcache_free_blocks       | 5096     |

| Qcache_free_memory       | 18964096 |

| Qcache_hits             | 12192192 |

| Qcache_inserts           | 3560370   |

| Qcache_lowmem_prunes     | 17326     |

| Qcache_not_cached       | 303599   |

| Qcache_queries_in_cache | 10201     |

| Qcache_total_blocks     | 25937     |

+-------------------------+----------+

8 rows in set (0.00 sec)

Qcache_total_blocks表示所有的块

Qcache_free_blocks表示未使用的块 这个值比较大,那意味着,内存碎片比较多,用flush query cache清理后,

为被使用的块其值应该为1或0 ,因为这时候所有的内存都做为一个连续的快在一起了:

mysql> show status like 'qcache%';

+-------------------------+----------+

| Variable_name           | Value     |

+-------------------------+----------+

| Qcache_free_blocks       | 1         |

| Qcache_free_memory       | 18539240 |

| Qcache_hits             | 12192502 |

| Qcache_inserts           | 3560515   |

| Qcache_lowmem_prunes     | 17326     |

| Qcache_not_cached       | 303607   |

| Qcache_queries_in_cache | 10318     |

| Qcache_total_blocks     | 21081     |

+-------------------------+----------+

8 rows in set (0.00 sec)

其他几个状态变量的意义:

Qcache_free_memory表示查询缓存区现在还有多少的可用内存

Qcache_hits表示查询缓存区的命中个数,也就是直接从查询缓存区作出响应处理的查询个数

Qcache_inserts表示查询缓存区此前总过缓存过多少条查询命令的结果

Qcache_lowmem_prunes表示查询缓存区已满而从其中溢出和删除的查询结果的个数

Qcache_not_cached表示没有进入查询缓存区的查询命令个数

Qcache_queries_in_cache查询缓存区当前缓存着多少条查询命令的结果

优化提示:

如果Qcache_lowmem_prunes 值比较大,表示查询缓存区大小设置太小,需要增大。

如果Qcache_free_blocks 较多,表示内存碎片较多,需要清理,flush query cache

根据我看的 《High Performance MySQL》中所述,关于query_cache_min_res_unit大小的调优

,书中给出了一个计算公式,可以供调优设置参考:

query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache

还要注意一点的是,FLUSH QUERY CACHE 命令可以用来整理查询缓存区的碎片,改善内存使用状况,

但不会清理查询缓存区的内容,这个要和RESET QUERY CACHE相区别,不要混淆,后者才是清除查询缓存区中

的所有的内容。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值