MySQL Query Cache

来源:互联网 发布:js获取字段值 编辑:程序博客网 时间:2024/04/29 02:06

A Practical Look at the MySQL Query Cache
http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html

数据库缓存策略:
(1)缓存经常被使用的数据
(2)缓存经常执行的SQL和存储过程代码
(3)缓存数据库元数据信息,包括:对象结构缓存、安全信息等

 

mysql引擎所使用的缓存:

(1)myisam:key buffer

(2)innodb:data + index buffer

(3)memory:data + index buffer

 

不是Cache Hit Ratio越高越好,假如:
A和B是不同的SQL语句,有不同的执行计划,但返回相同的结果集,并且A的数据库的缓存较大

SQLCache Hit RatioLogical I/OPhysical I/OTimeA99.99%1000010.405secsB90.00%1010.005secs

因为逻辑I/O会对内存进行锁操作来从内存建立结果集,这会造成许多CPU活动。

相关的参数:
(1)query_cache_type    ON|DEMAND|OFF
ON时,不缓存有SQL_NO_CACHE的SELECT
DEMAND时,只缓存SQL_CACHE的SELECT
(2)query_cache_size    查询缓存的大小;0时,是关闭查询缓存
(3)query_cache_limit    指示每个查询结果集最大的缓存限制,超过这个值的结果集不缓存
(4)query_alloc_block_size   缓存分配的块大小
(5)query_cache_min_res_unit    被分配给缓存的最小的块的数量
(6)query_cache_wlock_invalidate   被写锁无效化的查询缓存的数量
(7)query_prealloc_size   被缓存用于解析和执行的持久buffer的大小

相关的状态:
(1)Qcache_inserts:数据放入缓存的次数
(2)Qcache_hits:缓存命中的次数
(3)Qcache_free_blocks:缓存中自由的块数;如果此值很高,则指示了内存中有许多碎片,可以用flush query cache来解决这个问题
(4)Qcache_free_memory:自由缓存的大小
(5)Qcache_lowmem_prunes:指示有多少次mysql必须从查询缓存中移除条目,从而为了新进一次的查询
(6)Qcache_not_cached:不能够缓存的SQL结果集的数量

查询的限制:
(1)相同的查询可以被缓存服务
(2)任何DML语句,能够使相关于这个表的查询缓存无效
(3)多个函数,如:CURRENT_DATE,NOW,RAND用于查询中,则不被缓存
(4)使用用户定义的函数的查询不能被缓存

相关的命令:
set global
set session
show variables like 'query%'
show status like 'qc%';
flush status;
reset query cache;
flush query cache;

原创粉丝点击