InnoDB 线程模型
IO Thread
在 InnoDB 中使用了大量的 AIO(Async IO)来做读写处理,这样可以极大提高数据库的性能。在 InnoDB 1.0 版本之前共有 4 个 IO Thread,分别是 write、read、insert buffer 和 log thread,后来版本将 read thread 和 write thread 分别增大到了4个,一共有10个了。
-
read thread:
负责读取操作将数据从磁盘加载到缓存 page 页(4个线程)
-
write thread:
负责写操作,将缓存脏页刷新到磁盘(4个线程)
-
insert buffer thread:
负责将写缓冲内容刷新到磁盘(1个线程)
-
log thread:
负责将日志缓冲区刷新到磁盘(1个线程)
Purge Thread
事务提交之后,其使用的 undo 日志将不再需要,因此需要 Purge Thread 回收已经分配的 undo 页。
show variables like '%innodb_purge_threads%';
Page Cleaner Thread
作用是将脏数据刷新到磁盘,脏数据刷盘后相应的 redo log 也就可以覆盖,既可以同步数据,又能达到 redo log 循环使用的目的。会调用 write thread 线程处理。
show variables like '%innodb_page_cleaners%';
Master Thread
Master Thread 是 InnoDB 的主线程,负责调度其他各线程,优先级最高。
作用是将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。包含:
- 脏页的刷新(page cleaner thread)
- undo 页回收(purge thread)
- redo 日志刷新(log thread)
- 合并写缓冲等
其内部有两个主处理,分别是每隔 1 秒和 10 秒处理:
每隔 1s 的操作:
- 刷新日志缓冲区,刷到磁盘
- 合并写缓冲数据,根据 IO 读写压力来决定是否操作
- 刷新脏页数据到磁盘,根据脏页比例达到 75% 才操作(
innodb_max_dirty_pages_pct
、innodb_io_capacity
)
每隔 10s 的操作:
- 刷新脏页数据到磁盘
- 合并写缓冲区数据
- 刷新日志缓冲区
- 删除无用的 undo 页