最近在学习姜承尧老师的 InnoDB 的内容,然后觉得讲得特别好,其实很多时候关于 MySQL 的内容(或者说做的优化)都是基于 InnoDB 引擎的,这些专属的东西应该花时间去了解 InnoDB 而不是 MySQL (当然不是说 MySQL 不重要,不过了解原理比学会应用更有价值)。然后特别想挑一小段内容跟大家分享,如果有说得不对也希望指正!^_^
内存池:
后台线程:
设置原因:CPU 与磁盘速度之间的鸿沟。
在数据库中读取页的操作,先从磁盘读取到缓冲池中,读取相同页的时候判断是否在缓冲池中直接命中。
缓冲池中缓存的数据页类型有:
缓冲池允许有多个,通过参数配置,默认为 1。
最频繁使用的页在 LRU 列表的前端,而最少使用的页在 LRU 列表的尾端。
InnoDB 中设置了midpoint
位置,读取到新的页,虽然是“Recently Used”,但是先插入到 midpoint 位置而不是前端,默认配置下处于 LRU 列表长度的 5/8 处,midpoint 前的列表称为 new 列表,midpoint 后的列表称为 old 列表。使用 midpoint 优化的原因是在读取页的时候,因为会导致尾端的页被刷出 LRU 列表,如果直接在前端插入大量的页(一般为索引或扫描操作)会将 LRU 列表大量页刷出,而这部分插入的操作可能仅是一次性的,因此需要先将这些页放在 midpoint 位置,然后后续如果确实频繁使用再加入 LRU 列表的热端。
Free 列表表示可用的页,如果 Free 列表有可用的空闲页,就会将页从 Free 列表中删除、加入 LRU 列表中;如果没有,则要从 LRU 列表尾端淘汰,将内存分配给新的页。可以理解成 LRU 长度增加,Free 长度就减少,Free 没有的时候还需要插页面就需要从 LRU 淘汰。
在 LRU 列表中的页被修改后,称为 dirty page,缓冲区与磁盘中的数据不一致,这时候通过CHECKPOINT
机制刷回磁盘,Flush 列表中的页即为脏页列表,脏页既存在于 LRU 列表中也存在与 Flush 列表中,前者保证页的可用性,后者管理页刷回磁盘。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.