type
status
date
slug
summary
tags
category
icon
password
本章主要讲讲 InnoDB的磁盘IO行为,重点从 Read-Ahead 与 Doublewrite Buffer 两方面展开。之前在Buffer Pool 与 Doublewrite Buffer 这两章有着重介绍过,本章不再赘述。
整理定义
InnoDB在可能的情况下使用异步磁盘I/O,通过创建多个线程来处理I/O操作,同时允许其他数据库操作在I/O仍在进行中时继续进行。在Linux和Windows平台上,InnoDB使用可用的操作系统和库函数来执行“原生”的异步I/O。在其他平台上,InnoDB仍然使用I/O线程,但这些线程可能实际上会等待I/O请求完成;这种技术被称为“模拟”的异步I/O。
复述展开
预读(Read-Ahead)
如果InnoDB能够确定有高概率需要某些数据,它会执行预读操作,将这些数据带入缓冲池,以便数据在内存中可用。对连续数据进行少数几次大的读取请求比进行多次小的、分散的请求更有效率。InnoDB中有两种预读启发式方法:
在顺序预读中,如果InnoDB注意到对表空间中的段的访问模式是顺序的,它会提前批量发布数据库页面的读取请求到I/O系统。
在随机预读中,如果InnoDB注意到表空间中的某个区域似乎正在被完全读入缓冲池,它会将剩余的读取请求发布到I/O系统。
双写缓冲区(Doublewrite Buffer)
InnoDB使用一种称为双写缓冲区的新颖文件刷新技术,默认情况下在大多数情况下是启用的(innodb_doublewrite=ON)。它为意外退出或断电后的恢复增加了安全性,并且通过减少对fsync()操作的需求,在大多数Unix变体上提高了性能。
在将页面写入数据文件之前,InnoDB首先将它们写入称为双写缓冲区的存储区域。只有在写入和刷新到双写缓冲区完成后,InnoDB才将页面写入数据文件的适当位置。如果在页面写入过程中出现操作系统、存储子系统故障或意外的mysqld进程退出(导致“撕裂页面”情况),InnoDB可以在恢复期间从双写缓冲区中找到页面的良好副本。
理解体会
总结:
- InnoDB在可能的情况下使用异步磁盘I/O,以提高效率。
- 在Linux和Windows上,InnoDB执行原生异步I/O;在其他平台上,执行模拟异步I/O。
- InnoDB有两种预读机制来提高数据访问效率:顺序预读和随机预读。
- 顺序预读:当检测到对表空间段的顺序访问时,InnoDB会提前批量请求读取数据库页面。
- 随机预读:当检测到表空间的某个区域正在被读入缓冲池时,InnoDB会请求读取剩余的页面。
- InnoDB使用双写缓冲区来提高数据的安全性和提升性能。
- 在数据写入数据文件之前,先写入双写缓冲区。
- 这样做可以在系统崩溃或断电后,通过双写缓冲区恢复完好的页面数据。
- 双写缓冲区默认启用,并且在大多数Unix系统上减少了对fsync()操作的需求,从而提高了性能。
了解和配置这些特性可以帮助数据库管理员优化InnoDB的性能,并确保数据的完整性和可靠性。
- 作者:eachenkuang
- 链接:https://kuangyichen.com/article/industry-day92
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。