Innodb特性总结

157 阅读2分钟

Innodb特性总结

buffer pool

它是innodb自己实现的数据缓冲池,减少IO操作

  • 预读,磁盘IO一般不是按需读取,一次至少读一个页的数据(4k)。如果下一次仍需要读这个页,则无需再次IO
  • 缓存驱逐,一旦有缓存,就会有缓存失效机制,innodb采用了LRU机制
  • 预读失败、缓冲池污染 是普通LRU存在的问题,为了解决这个问题,innodb对LRU进行了重新设计,采用了分段list来提高缓存数据的有效性

change buffer

它是一种应用在非唯一普通索引页不在缓冲池中,对页进行了写操作,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(buffer changes),等未来数据被读取时,再将数据合并恢复到缓冲池中的技术。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。

  • 唯一辅助索引会失效
  • 适合写多读少的场景
  • 写完即读会增加读负载(一次磁盘io+change buffer的合并+增加脏页)

double write

  • buffer pool 数据刷新到磁盘时,有丢失部分数据的风险,因为磁盘的原子写入大小小于缓冲区的大小。因此会有坏数据的风险;
  • 因此出现double-write增强数据的可靠性,但是牺牲了一点性能
  • 为了解决写入问题,double-write先吧buffer写入一个连续的磁盘空间,来保障数据的不丢失 (这个写入非常快),随后在离散的写入真正的存储磁盘(随机IO)
  • 如果过程中发生崩溃,则可以通过double-write的磁盘来恢复
  • 为什么不用redo log来恢复?redo log是物理日志,发生坏页时,redo log 无法起作用

adaptive hash index

  • 对于访问频次非常高的数据会构建hash索引,条件苛刻;

Flush Neighbor Page

  • 当刷新一个脏页时,检测其邻接页是否为脏页,如果有则可以合并IO;
  • 对于有超高IOPS的SSD而言,可以关闭次特性
  • 是不是有可能讲不怎么脏的页刷新后有很快变成脏页了,可以考虑在写多读少的场景关闭次特性