Mysql为了避免每次SQL执行都要去访问磁盘,设计出了BufferPool。数据都是通过BufferPool进行增删改查的。比如执行数据更新操作时,有如下几步:
- Mysql会以page为单位从磁盘中加载数据到BufferPool中(数据存在就不用访问磁盘了)
- 需要更新的数据写入到undo日志(用于事务回滚)中
- 更新BufferPool中的数据
- 写redo日志(防止因异常原因导致BufferPool数据丢失时,恢复数据使用)
- 写
binlog
日志(多用于恢复数据库磁盘数据) - 向redo日志中写入commit标记
- 异步将BufferPool中变更的数据刷盘
如下图示:
- 为什么MySQL使用BufferPool+Redo日志来处理SQL呢?
因为基于BufferPool内存操作,效率是很高的,其次写Redo日志采用了顺序读写,相较于数据库磁盘文件的随机读写也是很高效的。