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而言,可以关闭次特性
- 是不是有可能讲不怎么脏的页刷新后有很快变成脏页了,可以考虑在写多读少的场景关闭次特性