InnoDB的缓存替换策略及其效果
总的来说InnoDB的缓存替换策略非常简单,性能开销很低,但不知道其效果如何,因此今天进行了测试。测试时的表每条记录包含一个INT和两个CHAR(200)类型的字段,共20万条记录,其访问概率使用screw为1.2的Zip-f分布生成,这样访问概率最高的10%的记录的总访问概率为95%。表大小约占7000个页面,测试时设置InnoDB可用于存储数据的缓存页为730(InnoDB缓存大小必须设置为64个页的整数倍,无法精确控制到700个),约为数据量的10%。这时,理论上最优的缓存失配率应为5%。
使用10个线程进行测试,每个进行100000次随机操作,每个操作根据概率随机访问一条记录。测试之前先进行了一次全表扫描来预热。
测试之前各类读操作统计如下
| Innodb_buffer_pool_reads | 77 || Innodb_data_reads | 7004 |
| Innodb_pages_read | 6994 |
测试之后各类读操作统计如下
| Innodb_buffer_pool_reads | 72055 |如果按Innodb_buffer_pool_reads计算,即不考虑预读时,测试期间读取的页面数为72000左右,失配率为7.2%。如果按Innodb_pages_read计算,即考虑预读时,测试期间读取的页面数为88200左右,失配率为8.8%。如理想的5%相比两者都还是有一定距离的。若能优化到理想状态,大致可以减少40%的IO。| Innodb_data_reads | 95197 |
| Innodb_pages_read | 95187 |
同样的条件对比测试了一下,我们的存储引擎测试期间产生的读操作为62100次,稳定时的失配率为6.1%左右。目前还不清楚为什么我们的存储引擎为什么表现会比InnoDB要好,因为两者的策略是类似的。可能是因为InnoDB中的预读机制在这类纯随机的负载下反而会影响到缓存的命中率。由于Innodb_pages_read明显的超过Innodb_buffer_pool_reads的增长,可以看出测试过程中InnoDB也在不定的进行预读,有可能预读进来无用的页面,导致有用的页面被替换出去。我们的存储引擎的预读检测机制有所不用,在测试期间没有发生预读。
建议继续学习:
- 浅析http协议、cookies和session机制、浏览器缓存 (阅读:15824)
- 分布式缓存系统 Memcached 入门 (阅读:14737)
- 强制刷新本地 DNS 缓存记录 (阅读:9254)
- Innodb IO优化-配置优化 (阅读:6672)
- php缓存与加速分析与汇总 (阅读:6316)
- Innodb分表太多或者表分区太多,会导致内存耗尽而宕机 (阅读:6157)
- Web应用的缓存设计模式 (阅读:5897)
- 浏览器缓存机制 (阅读:5785)
- 缓存设计的一些思考 (阅读:5742)
- 谈冷热数据 (阅读:5775)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:风轻扬 来源: 风轻扬
- 标签: InnoDB 缓存
- 发布时间:2009-10-14 18:28:01
- [43] android 开发入门
- [42] Oracle MTS模式下 进程地址与会话信
- [40] IOS安全–浅谈关于IOS加固的几种方法
- [38] Go Reflect 性能
- [37] 如何拿下简短的域名
- [37] 读书笔记-壹百度:百度十年千倍的29条法则
- [36] 图书馆的世界纪录
- [35] 【社会化设计】自我(self)部分――欢迎区
- [31] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑