诺亚方舟

沉淀

(转)mysql缓存,SQL_NO_CACHE和SQL_CACHE 的区别

SQL_NO_CACHE means that the query result is not cached. It does not mean
that the cache is not used to answer the query.

You may use RESET QUERY CACHE to remove all queries from the cache and
then your next query should be slow again. Same effect if you change
the table, because this makes all cached queries invalid.

从这里可以看出SQL_NO_CACHE的含义是指不把当前sql写入到cache,而不是指不从缓存中获取结果。SQL_CACHE的作用则是显式让mysql把结果写入到缓存中。

下面文章转自mysql缓存,SQL_NO_CACHE和SQL_CACHE 的区别

1、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)

mysql本身是有对sql语句缓存的机制的,合理设置我们的mysql缓存可以降低数据库的io资源。
have_query_cache
是否支持查询缓存区 “YES”表是支持查询缓存区
query_cache_limit
可缓存的Select查询结果的最大值 1048576 byte /1024 = 1024kB 即最大可缓存的select查询结果必须小于  1024KB
query_cache_min_res_unit 每次给query cache结果分配内存的大小 默认是 4096 byte 也即 4kB
query_cache_size 如果你希望禁用查询缓存,设置 query_cache_size=0。禁用了查询缓存,将没有明显的开销
query_cache_type= 查询缓存的方式(默认是 ON)
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相区别,不要混淆,后者才是清除查询缓存区中的所有的内容。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>