IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

InnoDB的缓存替换策略及其效果

风轻扬 2009-10-14 18:28:01 累计浏览 4,927 次
本机暂存
我们开发自己的存储引擎页面缓存替换策略的过程中主要是参考了InnoDB与LRU-K算法。InnoDB缓存替换策略使用分代与LRU相结合的方式。分为old和young两个分代,系统维护old分代占总buffer大小的3/8左右。当一个页面第一次被访问时,是加入到old分代的lru头。并不是每次访问一个页面时就将这个页提到lru的头部,而是在这个页面在LRU中的位置调整后,是否有很多页面已经被替换出去,若有,则将这个页面移到LRU头。系统在每个页记录调整该页在lru中位置当前系统总共替换了多少个数据页,比较页中记录的这个计数与系统全局页替换计数,就可以发现上次调整这个页在lru链表中位置后,系统中又有多少个页被替换,若比较多,则再次调整该页在lru中的位置。由于第一次访问的页被加入到old分代中,因此一次表扫描不会导致young分代中的页被替换出去。

    总的来说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也在不定的进行预读,有可能预读进来无用的页面,导致有用的页面被替换出去。我们的存储引擎的预读检测机制有所不用,在测试期间没有发生预读。

同分类推荐文章

  1. dd破坏包含50多个pdb的asm 磁盘组恢复 (2026-06-27 22:00:11)
  2. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  3. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)

查看更多 数据库 文章 →

建议继续学习

  1. 深入浅出INNODB MVCC机制与原理 (累计阅读 9,693)
  2. Innodb分表太多或者表分区太多,会导致内存耗尽而宕机 (累计阅读 7,722)
  3. Innodb IO优化-配置优化 (累计阅读 7,729)
  4. 由浅入深理解索引的实现(2) (累计阅读 7,716)
  5. MySQL中like语句及相关优化器tips (累计阅读 6,283)
  6. Innodb 表和索引结构 (累计阅读 6,230)
  7. InnODB和MyISAM索引统计集合 (累计阅读 6,237)
  8. 从load data引发的死锁说起 (累计阅读 6,145)
  9. 一次神奇的MySQL优化 (累计阅读 6,082)
  10. InnoDB线程并发检查机制 (累计阅读 5,805)