InnoDB关键特性

153 阅读2分钟

缓冲池: 索引页, 数据页, undo页, 插入缓冲, 自适应哈希索引, InnoDB存储的锁信息, 数据字典信息. 允许有多个缓冲池, 每个页通过哈希值平均分配到不同缓冲池实例中. 通过LRU(Lastest Recent Used, 最近最少使用算法)管理缓冲池.

LRU

  • InnoDB缓冲池中页的大小默认为16kb.
  • 最频繁使用的页出现在LRU列表的前端, 反之在尾端. 缓冲池无法存放新读取到的页时, 首先释放LRU的尾端.
  • 新读取到的页放在midpoint.由innodb_old_blocks_pct控制midpoint的位置, 默认是5/8的地方.
  • midpoint之前的列表称为new, 表示活跃的热点数据. 之后的称为old.
  • 较之朴素的LRU算法, 带有midpoint的LRU算法可以防止某些SQL操作误将LRU列表中的页清出.
  • innodb_old_blocks_time, 用于表示页读取到mid位置后需要等待多久才会被加入到LRU列表的new端.

1. 插入缓冲 Insert Buffer

是一颗B+树, 全局只有一颗, 负责对所有的表的辅助索引进行Insert Buffer, 存放在共享表空间中. 导致恢复数据时, 不仅需要通过ibd文件进行恢复, 也需要进行REPAIR TABLE操作来重建表上的所有辅助索引.

性能上的提升

2. 两次写Double Write

数据页的可靠性. 为了解决刷脏页时由于数据库缓存单位16kb, IO最小单位4kb和文件最小单位512字节的不匹配导致的问题, 将缓冲池中的数据先先写入doublewritebuffer中, 再存入磁盘中的共享表空间中, 这两个位置都是2M. 在顺利的时候, 一次普通的刷页操作会顺序写入doublewritebuffer和ibddata中, 然后离散地将doublewritebuffer写入磁盘. 这个过程中如果发生意外, 则会通过doublewritebuffer中的数据页复制到表空间

3. 自适应哈希索引

4. 异步IO

5. 刷新邻近页

6. 启动, 关闭与恢复

关闭时: full perge, merge insert buffer并且将脏页刷新回磁盘.