总的来说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_data_reads | 95197 |
| Innodb_pages_read | 95187 |
如果按Innodb_buffer_pool_reads计算,即不考虑预读时,测试期间读取的页面数为72000左右,失配率为7.2%。如果按Innodb_pages_read计算,即考虑预读时,测试期间读取的页面数为88200左右,失配率为8.8%。如理想的5%相比两者都还是有一定距离的。若能优化到理想状态,大致可以减少40%的IO。
同样的条件对比测试了一下,我们的存储引擎测试期间产生的读操作为62100次,稳定时的失配率为6.1%左右。目前还不清楚为什么我们的存储引擎为什么表现会比InnoDB要好,因为两者的策略是类似的。可能是因为InnoDB中的预读机制在这类纯随机的负载下反而会影响到缓存的命中率。由于Innodb_pages_read明显的超过Innodb_buffer_pool_reads的增长,可以看出测试过程中InnoDB也在不定的进行预读,有可能预读进来无用的页面,导致有用的页面被替换出去。我们的存储引擎的预读检测机制有所不用,在测试期间没有发生预读。
我们猜你喜欢:
- MySQL数据库InnoDB数据恢复工具使用总结 [2012-03-05 10:06:35]
- Row Cache For Innodb [2011-09-10 17:23:21]
- 快速预热Innodb Buffer Pool的方法 [2011-07-11 11:12:22]
- Innodb Crash Recovery恢复时间的飞跃 [2011-07-13 12:24:18]
- 存储方式与介质对性能的影响 [2011-06-10 15:49:58]
- InnoDB的多版本一致性读的实现 [2011-03-24 00:08:35]
- 动态加载Innodb Plugin [2010-11-12 16:37:40]
- 思考mysql内核之初级系列14---innodb的旧式记录结构 [2010-09-07 01:54:00]
- 思考mysql内核之初级系列13---innodb的簇页管理 [2010-08-27 23:14:00]
- 思考mysql内核之初级系列12---innodb的簇描述结构 [2010-08-22 23:54:00]
- Innodb Log写入方式分析 [2010-08-19 13:35:45]
- 思考mysql内核之初级系列11---innodb的页编号 [2010-08-15 15:10:00]
- InnoDB主键设计 [2010-08-03 16:08:33]
- 思考mysql内核之初级系列9---innodb动态数组的实现 [2010-08-01 20:54:00]
- 思考mysql内核之初级系列8---innodb的list算法 [2010-08-01 16:50:00]
- 思考mysql内核之初级系列7---innodb的hash表实现 [2010-07-25 16:59:00]
- 思考mysql内核之初级系列6---innodb文件管理 [2010-07-24 22:29:00]
- 思考mysql内核之初级系列5---information_schema不是innodb数据字典 [2010-07-18 23:50:00]
- 思考mysql内核之初级系列4--innodb缓冲区管理 [2010-07-13 00:23:00]
- XtraDB/Innodb内部结构示意图 [2010-05-03 18:14:54]
- InnoDB Double write [2010-02-08 16:26:00]
- Innodb 表和索引结构 [2010-01-20 22:11:44]
- InnoDB线程并发检查机制 [2010-02-05 22:37:41]
- Innodb 多版本实现 [2010-01-05 22:08:10]
- InnoDB线程并发检查机制 [2009-12-30 17:02:41]
- Innodb文件表空间结构 [2009-12-15 20:38:50]
- Innodb如何使用内存 [2009-12-12 23:17:12]
- 更改Innodb 数据页大小优化MySQL [2009-12-13 14:24:25]
- InnoDB的”替代品”:Percona XtraDB [2009-12-07 12:49:22]
- 推荐使用innodb_plugin [2009-11-07 21:13:10]
- Innodb共享表空间VS独立表空间 [2009-10-12 16:12:52]
- 多版本并发控制:PostgreSQL vs InnoDB [2009-11-07 22:15:44]
- InnoDB线程并发检查机制 [2009-11-07 21:52:02]
- MySQL InnoDB性能调整的一点实践 [2009-09-03 13:36:34]
- MyISAM和InnoDB的一些记录 [2009-09-05 17:03:32]
- Innodb分表太多或者表分区太多,会导致内存耗尽而宕机 [2009-06-18 10:54:21]
- MyISAM和InnoDB的插入性能测试 [2009-07-13 15:20:41]
- InnoDB select性能拐点测试 [2009-07-26 23:19:25]
- InnoDB insert性能拐点测试 [2009-07-28 22:40:38]
- InnoDB之Dirty Page、Redo log [2009-08-18 10:01:22]
- 随机主键对InnoDB插入性能的影响 [2009-08-18 11:30:29]
- 使用memc-nginx和srcache-nginx构建高效透明的缓存机制 [2011-10-10 16:54:36]
- 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制 [2011-10-02 23:10:00]
- 缓存设计的一些思考 [2011-06-19 20:37:08]
- Linux高速缓存使用率调查 [2011-06-01 17:33:09]
- 强制刷新本地 DNS 缓存记录 [2011-02-01 12:36:21]
- 前端开发中的性能那点事(三)php的opcode缓存 [2010-12-31 11:47:33]
- 系统架构的一些思考 [2010-12-22 08:37:00]
- squid缓存失效之谜:一步步提高squid缓存命中率办法记录 [2010-11-30 13:44:10]
- 分布式缓存系统 Memcached 入门 [2010-11-25 11:32:30]
- PHP加速器 eaccelerator 缓存原理 [2010-11-02 23:57:27]
- 谈冷热数据 [2010-10-23 12:10:00]
- 一个cache的改造过程 [2010-10-18 18:38:26]
- MySQL的高速查询缓存强制要求使用高速缓存 [2010-10-07 18:36:07]
- javascript 缓存提供程序 [2010-07-13 09:25:01]
- 浏览器缓存机制 [2010-03-05 14:19:51]
- 小心对待query_cache_size [2010-01-08 14:25:19]
- PHP强制浏览器不缓存的方法 [2009-12-24 17:33:51]
- 控制浏览器是否缓存网页状态 [2009-10-09 14:59:00]
- 面向站长和网站管理员的Web缓存加速指南[翻译] [2007-09-06 00:28:05]
- 基于反相代理的Web缓存加速――可缓存的CMS系统设计 [2003-06-06 17:27:18]
- 清除Firefox下Flash(swf文件)缓存 [2009-05-08 22:59:34]
- Query Cache,看上去很美 [2009-08-27 13:57:04]
- mysql cache功能小记 [2009-10-09 14:15:00]
- Smarty之缓存操作 [2008-06-01 18:07:55]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述