呵呵呵呵呵

萝莉有三好,柔体 轻音 易推倒。女神有三宝,干嘛 呵呵 去洗澡。宅男有三好:Dota 基友 破电脑。


mysql中SQL_NO_CACHE和SQL_CACHE 的区别

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相区别,不要混淆,后者才是清除查询缓存区中
的所有的内容。
------------------------------------------------------------------------------
可以在 SELECT 语句中指定查询缓存的选项,对于那些肯定要实时的从表中获取数据的查询,或者对于那些一天只执行一次的查询,我们都可以指定不进行查询缓存,使用 SQL_NO_CACHE 选项。
对于那些变化不频繁的表,查询操作很固定,我们可以将该查询操作缓存起来,这样每次执行的时候不实际访问表和执行查询,只是从缓存获得结果,可以有效地改善查询的性能,使用 SQL_CACHE 选项。
下面是使用 SQL_NO_CACHE 和 SQL_CACHE 的例子:
mysql> select sql_no_cache id,name from test3 where id < 2;
mysql> select sql_cache id,name from test3 where id < 2;
注意:查询缓存的使用还需要配合相应得服务器参数的设置。

更多内容:

mysql 查询缓存配置方法
清空mysql 查询缓存的可行方法
mysql查询缓存的工作原理与优缺点
MySQL设置查询缓存提高MySQL查询性能的方法
MySQL中group by性能优于distinct

本文链接地址:http://www.hehehehehe.cn/i/802.html