MySQL Query Cache

MySql Query Cache
我们多知道mysql的查询是有缓存的,MySqlQueryCache不缓存执行计划而是整个结果集。我们要从Cache去中命中我们的查询结果,Query必须是完全一样的,导致的结果是Query改变就无法命中我们的查询,mysql会把改变后的Query作为一个新的Cache。因为mysql缓存的是整个结果集,所以Qcache_hits并不是很高。
1、Cache 机制对应用程序是透明的。

2、只缓存整个查询结果集,即对子查询,内联视图和 部分UNION的查询不缓存的。
注:我在执行 部分UNION的时候,观察Qcache_queries_in_cache值也是增加的 不知道是不是和部分UNION的查询是不缓存有点矛盾?请大牛指正 我现在姑且当作union查询是缓存的

3、缓存机制工作在Packet 级别,第二项的只缓存整个查询结果集就是因为局限于这个机制的原因。由于没有额外的转换和处理,所以保证缓存结果集返回能够非常快。

4、缓存处理在解析查询前进行,保证缓存高性能的一个原因就是查询缓存在执行查询解析前先查找是否已经存在缓存,如果已经存在查询缓存,则直接返回结果集。

5、查询必须绝对完全同,由于在查找缓存是否存在前不进行查询解析( Query Parser )所以查询并没有经过规范化处理(Normalized),因此缓存查找的过程是按字节顺序进行的 ( Byte by byte )。更具体点说吧:在每次查询时包不同的注释、多余的空格以及大小写不同等等,都不会指向同一个缓存结果集。
注:sql语句必须完全一致 包括条件的值 如select * from user_id=1 和select * from user_id=2会作为两个不同的缓存

6、只有 SELECT 语句被缓存。 插入、删除、更新当然不需要进行缓存了,同时 SHOW 命令和 存储过程 stored procedure (包括存储过程中的SELECT)也不会进入缓存结果集,
查询缓存失效的粒度级别的是表,当表被修改时,所有与改表相关的缓存立即失效( invalidation )。
注:对同一张表的update、delete、insert操作会清空该表的QueryCache

7、空格和注释不要出现在查询语句的最前面,当查找缓存时第一个字幕如果不是"S" ,就会停止查询缓存结果集了。第5、6项已经解释过了。
注:我试过在SQL前面有空格是可以被缓存的,mysql缓存的时候会自动去掉前面的空格的;
在SQL前面有注释也会被缓存,等同于没有注释,我用的SQL语句如:/**/select

8、不支持预备查询 prepared statement 和 游标 cursors 。?

9、不支持事务处理。?

10、查询结果必须完全一致,才能进入缓存结果集。比如:查询语句中有 UUID , RAND , CONNECTION_ID 等会动态改变查询结果集的函数,都不会进入缓存结果集的。Ok

11、过长时间的查询缓存容易造成碎片 fragmentation  ,这一点和Windows的磁盘管理的碎片整理类似,长时间查询缓存产生的碎片对执行效率有一定影响。可以把查询缓存碎片看作是是查询缓存可用内存(Qcache_free_memory)的块(Qcache_free_blocks )。FLUSH QUERY CACHE  命令可以削除这种情况。

12、设定适当大小的查询缓存用的内存,由于前面提到的一些原因,一般情况下MySql 的查询缓存机制对内存的需求不可能无限增长,因此设定一个适当的查询缓存内存值是比较经济的做法。可以通过查看 Qcache_free_memory 和 Qcache_lowmem_prunes 的状态来进行适当设置。

13、查询缓存的运行模式,默认情况下开启缓存后MySql 的缓存机制对全局的有效,如果你只想对特定的查询语句使用缓存,可以通过把 query_cache_type  设定为 “DEMAND” 并且在查询语句中加入: SQL_CACHE  来进行,比如:SELECT SQL_CACHE DomoloSeoHelper from domolo where author='tianchunfeng' 。

==========================================================================

几个命令:
mysql> show status like 'Qcache%'; #查看mysql查询缓存的运行时状态
mysql> reset query cache ;#重置mysql查询缓存

来源: http://tianchunfeng.spaces.live.com/blog/cns!819E33AA1808A272!315.entry
具体解释参考:  http://dev.mysql.com/doc/refman/5.0/en/query-cache-status-and-maintenance.html

你可能感兴趣的:(sql,mysql,windows,cache,Blog)