🗒️Day92【概念解析】InnoDB Disk I/O
00 分钟
2023-12-22
2023-12-22
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的性能,并确保数据的完整性和可靠性。
上一篇
Day93【概念解析】File Space Management
下一篇
[分享]unsplash免费图片接口使用与实战

评论
Loading...