Innodb存储引擎的体系结构之后台线程

465 阅读3分钟

Innodb存储引擎的体系结构主要由三个部分组成:

  • 后台线程
  • 内存
  • 文件系统

Innodb架构图

Innodb后台线程的作用

我们都知道,磁盘IO是这个操作系统中最慢的一环。减少磁盘操作可以提升性能。

Innodb通过缓冲池将部分数据放在内存中,一部分数据的查询和更新都在内存完成,从而减少磁盘IO操作,提升性能。

如果我们的更新操作都在内存中完成,如果内存不够用或者宕机了怎么办?(内存空间相比硬盘更小、不能持久保存)

Inndo体系结构中的线程扮演的角色就是主要负责将内存中存在、而磁盘中不存在的数据进行同步。

知道了线程的主要作用,那么就开始看看线程中是怎么做的吧

Innodb后台线程的种类

在Innodb中后台线程主要有三个种类:

  • Master Thread
  • Io Thread
  • Purge Thread

为啥搞这么多的线程,用一个线程不可以么

首先,笔者认为用一个线程也一定可以实现既有功能。但是无论是职责上、还是性能上都会存在问题。

职责:软件开发讲究的单一职责,只有单一职责可以让单点在架构中的角色更清晰,也利于维护。

性能:上文描述过后台线程的主要工作是将内存的数据同步到磁盘中,可想而知,这是一个IO操作,而多线程最适合的场景就是IO操作,所以多个线程在性能上一定是比单线程更好的。

Master Thread

master在英文中是主人的意思,MasterThread也就是主线程的意思,根据名字我们都知道这个后台线程在Innodb的职责是最重要的。它负责的主要功能如下:

  • 将redo log刷新到磁盘中
  • 合并change buffer
  • 刷新脏页到磁盘中
  • 删除无用的Undo页

这些功能,不一一介绍,因为这些并不是本章的重点,可以理解为这些操作大多数同步内存中的磁盘中,后续章节会详细介绍。

Io Thread

对磁盘进行读写操作的线程,Inndo存储引擎中使用了AIO来处理IO请求,这样可以极大提升数据库的性能。 如果mysql进程所在的操作系统支持nio,同时innodb_user_native_aio设置为on(linux操作系统默认为on)的话,会使用aio进行io操作。 通过设置innodb_read_io_threads和innodb_write_io_threads参数设置对应io线程的数量

Purge Thread

purge是清理的意思,这个后台线程的作用也是用来清理数据。在特定情况下,事务提交后的undo log不会在需要了(讲到事务的时候,会详细介绍undo log), purge thread的作用就是回收undo page

引用

MySQL技术内幕(第二版)