微信号:blogread

介绍:本号收录IT领域的优秀技术博客;在这里你可以找到Web开发、系统架构、数据库、前端技术、用户体验等领域的前沿文章. 官网:http://blogread.cn/it/

Query Cache,看上去很美

2013-11-07 18:56 Taobao

当你的数据库打开了Query Cache(简称QC)功能后,数据库在执行SELECT语句时,会将其结果放到QC中,当下一次处理同样的SELECT请求时,数据库就会从QC取得结果,而不需要去数据表中查询。

 在这个“Cache为王”的时代,我们总是通过不同的方式去缓存我们的结果从而提高响应效率,但一个缓存机制是否有效,效果如何,却是一个需要好好思考的问题。在MySQL中的Query Cache就是一个适用较少情况的缓存机制。在上图中,如果缓存命中率非常高的话,有测试表明在极端情况下可以提高效率238%[1]。但实际情况如何?Query Cache有如下规则,如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之。这里“数据表更改”包括: INSERTUPDATEDELETE,TRUNCATEALTER TABLEDROP TABLE, or DROP DATABASE等。举个例子,如果数据表posts访问频繁,那么意味着它的很多数据会被QC缓存起来,但是每一次posts数据表的更新,无论更新是不是影响到了cache的数据,都会将全部和posts表相关的cache清除。如果你的数据表更新频繁的话,那么Query Cache将会成为系统的负担。有实验表明,糟糕时,QC会降低系统13%[1]的处理能力。

如果你的应用对数据库的更新很少,那么QC将会作用显著。比较典型的如博客系统,一般博客更新相对较慢,数据表相对稳定不变,这时候QC的作用会比较明显。

再如,一个更新频繁的BBS系统。下面是一个实际运行的论坛数据库的状态参数:

 

QCache_hit 5280438
QCache_insert 8008948
Qcache_not_cache 95372
Com select 8104159

 

可以看到,数据库一共往QC中写入了约800W次缓存,但是实际命中的只有约500W次。也就是说,每一个缓存的使用率约为0.66次。很难说,该缓存的作用是否大于QC系统所带来的开销。但是有一点是很肯定的,QC缓存的作用是很微小的,如果应用层能够实现缓存,将可以忽略QC的效果。

关于QC的一些其他细节,请点击左下角“阅读原文”。

 
IT技术博客大学习 更多文章 Linux进程管理命令详解(ps和top) MySQL服务启动脚本完全解析 服务器集群架构的设计与选择 合理使用MySQL的Limit进行分页 相似度计算常用方法综述
猜您喜欢 PHP核心知识要点 一 猴年新技能,看H5七十二变 C# 多线程学习(六):互斥对象 作为移动开发者,你应该了解Baas(后端即服务) 教你爱上Blocks(闭包)