MySQL的发行方式有很多种:

  • RPM包
  • tar.gz源码包
  • tar.gz编译好的二进制包

不同的发行方式,目录结构有所不同,这里以二进制安装包的发行版为例进行说明;
它主要包含以下目录:

目录名说明备注
bin包含客户端程序与mysqld等,二进制可执行文件
docs包含ChangeLog等信息
include包含头文件的目录
lib可动态加载的so库文件目录
man包含man1 / man8,可以利用这两个目录配置MySQL的帮助手册
share包含MySQL初始化的一些SQL脚本以及错误代码、本地化语言文件等
support-files包含单实例启停脚本mysql.server和多实例启停脚本mysql_multi.server等

数据目录:

检索数据目录【datadir】中的文件:

tree /home/mysql/data/mysqldata1/* | grep -Ei '.frm|.myi|.myd|.ibd' | awk -F '.' '{print $2}' | sort | uniq -c
tree /home/mysql/data/mysqldata1/* | grep -Eiv '.frm|.myi|.myd|.ibd'

数据文件:

  • .frm:表结构定义文件
  • .myi:MyISAM存储引擎索引文件
  • .myd:MyISAM存储引擎数据文件
  • .ibd:InnoDB存储引擎独立表空间文件
  • .ibdata*:InnoDB存储引擎共享表空间文件
  • .ib_logfile*:InnoDB存储引擎redo log文件
  • undo*:InnoDB存储引擎独立undo文件
  • ibtmp1:InnoDB存储引擎临时表空间文件
  • auto.cnf:用于存放MySQL实例的全局唯一的server-uuid的文件
  • db.opt:用于存放MySQL实例的schema级别的默认字符集合默认校对规则的文件
  • .csm:用于存放CSV存储引擎的元数据等相关信息的文件
  • .csv:用于存放CSV存储引擎的数据文件,每行数据的列值之间使用逗号分隔
  • .trn:用于存放与触发器相关的元数据
  • .trg:用于存放触发器定义语句以及与定义相关的信息
  • .sdi:MySQL 8.0新增,改文件中记录的是JSON格式的表结构描述信息

配置文件:my.cnf

MySQL读取配置文件的顺序(Linux/Unix):

  1. /etc/my.cnf
  2. /etc/mysql/my.cnf
  3. /usr/local/mysql/etc/my.cnf
  4. ~/my.cnf

可以用下面查看MySQL命令的帮助文档:

mysql --help | grep '/etc/my.cnf'

注意:

  • 如果没有显示的指定配置文件,则MySQL会依次按照顺序进行读取,知道读取到最后一个配置文件
  • 如果遇到多个配置文件中有相同的配置参数,那么,将以最后读取到的配置文件的配置为准。

日志文件:

  • error.log:错误日志,记录MySQL启动后mysqld打印的相关信息
  • localhost.log:一般查询日志,启用该日志后,在MySQL Server中执行的所有SQL语句都会被记录。查询日志可以在MySQL Server启动后,动态开关、自动创建
  • mysql-bin.*:二进制日志,用于复制架构中的数据同步,从库的IO线程从主库读取,MySQL Server中涉及数据变更的SQL语句都会被记录,可以指定单个文件的大小,写满指定大小的文件后,会自动切换到一个新的文件,文件名的序号数字自动加一
  • mysql-relay-bin.*:中继日志,用于复制架构中的数据同步,从库的IO进程从主库读取binlog之后,写入自身的中继日志中
  • slow-query.log:慢查询日志,SQL语句的执行时间超过指定时间,被认为执行缓慢,会被记录到该日志中

其他文件:

  • mysql.pid:MySQL Server启动之后,存放进程号的文件
  • mysql.sock:MySQL Server启动之后,用于本地UNIX Domain通信的sock文件
  • mysql.sock.lock:MySQL Server启动之后,用于锁定本地socket文件的锁标记文件;该文件是MySQL 5.7.x版本中新增的,如果MySQL Server非正常关闭,该文件可能残留而导致MySQL重新启动失败,删除该文件后重启即可

在MySQL 8.0中,有以下变化:

  • 数据字典库 performance_schema / mysql / sys 中所有MyISAM存储引擎都改为了 InnoDB存储引擎
  • 所有的.frm文件都不见了,表结构文件与视图等定义信息被存放到了InooDB存储引擎的数据字典表中
  • performance_schema数据字典表和mysql夏的general_log / slow_log表很特殊,因为不支持事务,所以使用了新的.sdi后缀的文件来代替,改文件中记录的是JSON格式的表结构描述信息

MySQL体系结构

官方有个MySQL的体系结构图:
https://www.mysql.com/common/images/PSEA_diagram.jpg

上图中的各个组件的介绍:

Connectors:连接者,指的是不同语言中与SQL的交互;从图中可以看到目前流行的语言都支持MySQL客户端的连接

Connection Pool:连接好词,管理缓冲用户连接、线程处理等需要缓存的需求;在这里也会进行用户账号、密码和库表权限的验证

SQL Interface:SQL接口,接受用户执行的SQL语句,并返回查询的结果

Parser:查询解析器,SQL语句被传递到解析器时会进行验证和解析,解析成MySQL人事的语法,查询什么表,查询什么字段;解析器时由Lex和YACC实现的,是一个很长的脚本;其主要功能是将SQL语句分解成数据结构,并将这个结构传递到后续步骤中,后续SQL语句的传递和处理都是基于这个结构的;如果在分解构成中遇到错误,则说明该SQL语句可能有语法错误或者不合理

Optimizer:查询优化器,在查询之前,SQL语句会使用查询优化器对查询进行优化,生成查询路径树,并选举一条最优的查询路径;它使用以下策略进行查询:选取 – 投影 – 连接

Caches & Buffers:缓存与缓冲,主要包含QC以及表缓存、权限缓存等;对于QC,以往主要用于MyISAM存储引擎,目前MySQL 8.0中已经废弃,对于现在非常流行的InnoDB存储引擎来说,QC已经没有任何意义,因为InnoDB存储引擎有自己的非常完善的缓存功能;除了QC之外,记录缓存、Key缓存,可以使用参数单独关闭,该缓存机制还包括表缓存与权限缓存等,这些都属于Server层的功能,其他的存储引擎仍然需要使用到

Pluggable Storage Engines:插件式存储引擎:
存储引擎是MySQL中具体的与文件打交道的子系统,也是MySQL最有特色的一个地方。
MySQL的存储引擎是插件式的,它根据MySQL AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制,这种访问机制就叫做存储引擎。

目前存储引擎众多,且它们的优势各不相同:

现在最常用于OLTP场景的是InnoDB,InnoDB也支持OLAP,但是MySQL自身的机制并不擅长OLAP场景

Files & Logs:磁盘物理文件,包含MySQL的各个引擎的数据、索引的文件,以及redo log、undo log、binary log、error log、query log、slow log等各种日志文件

File System:
文件系统,对存储设备的空间进行组织与分配,负责文件存储并对存入的文件进行保护和检索的系统;
它负责为用户建立文件,存入、去除、修改、转储文件,控制文件的存取
常见的文件系统包括:XFS / NTFS / EXT4 / EXT3 / NFS 等
通常数据库服务器使用的磁盘建议使用XFS文件系统。

为了说明上面各个组件之间的协同工作,以一个查询的例子说明:

当MySQL中有一个查询会话请求的时候,大概的流程如下图所示:

具体:

  1. MySQL客户端对MySQL Server的舰艇端口发起请求
  2. 在连接者组件层创建连接、分配线程,并验证用户名、密码和库表权限
  3. 如果打开了query_cache,则检查,有数据的话直接返回,否则继续往下执行
  4. SQL接口组件接受SQL语句,将SQL语句分解成数据结构,并将这个结构传递到后续步骤中;将SQL语句解析成MySQL认识的语法
  5. 查询优化器组件生成查询路径树,并选举一条最优的查询路径
  6. 调用存储引擎接口,打开表、执行查询,检查存储引擎缓存中是否有对应的缓存记录,如果没有就继续往下执行
  7. 到磁盘的物理文件中寻找数据
  8. 当查询到所需要的数据后,写入存储引擎缓存,如果打开了query_cache,也同时写进去
  9. 返回数据给客户端
  10. 关闭表
  11. 关闭线程
  12. 关闭连接

MySQL中的存储引擎


查看MySQL支持的存储引擎列表:

MariaDB [(none)]> select * from information_schema.engines\G
*************************** 1. row ***************************
      ENGINE: CSV
     SUPPORT: YES
     COMMENT: Stores tables as CSV files
TRANSACTIONS: NO
          XA: NO
  SAVEPOINTS: NO
*************************** 2. row ***************************
      ENGINE: MRG_MyISAM
     SUPPORT: YES
     COMMENT: Collection of identical MyISAM tables
TRANSACTIONS: NO
          XA: NO
  SAVEPOINTS: NO
*************************** 3. row ***************************
      ENGINE: MEMORY
     SUPPORT: YES
     COMMENT: Hash based, stored in memory, useful for temporary tables
TRANSACTIONS: NO
          XA: NO
  SAVEPOINTS: NO
*************************** 4. row ***************************
      ENGINE: Aria
     SUPPORT: YES
     COMMENT: Crash-safe tables with MyISAM heritage. Used for internal temporary tables and privilege tables
TRANSACTIONS: NO
          XA: NO
  SAVEPOINTS: NO
*************************** 5. row ***************************
      ENGINE: MyISAM
     SUPPORT: YES
     COMMENT: Non-transactional engine with good performance and small data footprint
TRANSACTIONS: NO
          XA: NO
  SAVEPOINTS: NO
*************************** 6. row ***************************
      ENGINE: SEQUENCE
     SUPPORT: YES
     COMMENT: Generated tables filled with sequential values
TRANSACTIONS: YES
          XA: NO
  SAVEPOINTS: YES
*************************** 7. row ***************************
      ENGINE: InnoDB
     SUPPORT: DEFAULT
     COMMENT: Supports transactions, row-level locking, foreign keys and encryption for tables
TRANSACTIONS: YES
          XA: YES
  SAVEPOINTS: YES
*************************** 8. row ***************************
      ENGINE: PERFORMANCE_SCHEMA
     SUPPORT: YES
     COMMENT: Performance Schema
TRANSACTIONS: NO
          XA: NO
  SAVEPOINTS: NO
8 rows in set (0.001 sec)

MariaDB [(none)]>
MariaDB [(none)]> select * from information_schema.engines where support='DEFAULT'\G
*************************** 1. row ***************************
      ENGINE: InnoDB
     SUPPORT: DEFAULT
     COMMENT: Supports transactions, row-level locking, foreign keys and encryption for tables
TRANSACTIONS: YES
          XA: YES
  SAVEPOINTS: YES
1 row in set (0.001 sec)

MariaDB [(none)]>
MariaDB [(none)]> select * from information_schema.engines where transactions='YES'\G
*************************** 1. row ***************************
      ENGINE: SEQUENCE
     SUPPORT: YES
     COMMENT: Generated tables filled with sequential values
TRANSACTIONS: YES
          XA: NO
  SAVEPOINTS: YES
*************************** 2. row ***************************
      ENGINE: InnoDB
     SUPPORT: DEFAULT
     COMMENT: Supports transactions, row-level locking, foreign keys and encryption for tables
TRANSACTIONS: YES
          XA: YES
  SAVEPOINTS: YES
2 rows in set (0.001 sec)

MariaDB [(none)]>

可以看到InnoDB是默认的存储引擎,也是一个同时支持事务、XA、SAVEPOINT的存储引擎。

在MySQL中,除了有默认安装的存储引擎之外,还可以通过插件安装的方式来支持更多的第三方的存储引擎,例如:

  • TokuDB
  • InfoBright
  • 等等

虽然MySQL支持众多的存储引擎,但是在MySQL官方版本以及其他的分支版本中,InnoDB存储引擎的使用率最高,且能满足99%的使用场景;
从MySQL 8.0.x开始,MySQL中所有的数据字典库都把MyISAM改为了InnoDB存储引擎。


InnoDB存储引擎架构:

Percona:
https://www.percona.com/blog/2010/04/26/xtradb-innodb-internals-in-drawing/

dev.mysql.com:
地址:https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html

地址:https://dev.mysql.com/doc/refman/5.6/en/innodb-architecture.html

PS:MySQL 5.6与5.7的体系结构还是有一些差别与变化的;

从上面的几张InnoDB的体系结构图可以看到,MySQL存储引擎的体系结构主要分为两大部分:

  • 内存结构
  • 磁盘结构

内存结构

Buffer Pool:缓冲池
缓冲池是InnoDB在启动的时候分配的一个内存区域;
用于InnoDB在访问数据的时候缓存表和索引数据;
利用缓冲池,可以合并一些对经常访问的数据的操作,直接从内存中处理,加快了处理速度;
通常,在专用数据库服务器上,可以将80%的物理内存分配给InnoDB缓冲池;
为了提高缓存管理的效率,使用页面链表的方式+LRU(最近最少使用)算法进行管理

Change Buffer(Insert buffer part of buffer pool)
这是一种特殊的数据结构,在早期只支持INSERT操作的缓存,所以也叫做INSERT BUFFER;
当受影响的页面不在缓冲池中的时候,将会缓存对辅助索引页的更改;
这些更改可能是由INSERT / UPDATE / DELETE (DML)语句执行导致的;
当其他读取操作从磁盘中加载数据页时,如果这些数据也包含在Change Buffer中缓存的更改操作页,那么,将进行合并操作

Adaptive Hash Index:自适应哈希索引(AHI)
用于管理缓冲池中的内部数据结构,并对缓冲池中的相关工作负载和内存操作组合进行自动调节,且不会牺牲任何事务功能、性能与可靠性

Log Buffer(Redo Log Buffer):重做日志缓冲区
用于保存将要写入重做日志磁盘文件中的数据的内存缓冲区;
重做日志缓冲区的大小由【innodb_log_buffer_size】配置参数定义;
重做日志缓冲区中的内容会定期刷新到磁盘上的日志文件中;
更大的重做日志缓冲区允许运行更大的事务,这在一定程度上避免提交大事务之前需要将重做日志写入磁盘;
因此,如果在应用场景中经常有大事务,则可以考虑增大重做日志缓冲区,以减少磁盘IO操作;
innodb_flush_log_at_trx_commit参数,控制如何将重做日志缓冲区的内容写入日志文件中;
当设置为1的时候,每个事务提交的时候都需要执行一次将重做日志缓冲区的内容写入日志文件中的操作;
innodb_flush_log_at_timeout参数,控制重做日志的刷新频率


磁盘结构

System Tablespace:InnoDB系统表空间包含InnoDB数据字典(InnoDB相关对象的元数据)、DoubleWrite Buffer、Change Buffer磁盘部分和Undo Logs,还包含在系统表空间中创建的任何表和索引数据;
它之所以称为系统表空间,是因为它可以被多个用户表共享:
系统表空间可以由一个或者多个数据文件构成;
默认情况下,智慧创建一个名为ibdata1的共享表空间文件;
但是可以使用参数innodb_data_file_path控制共享表空间的数量和大小

Data Dictionary(InnoDB Data Dictionary)
InnoDB数据字典表由内部系统表组成,这些系统表包含用于跟踪对象的元数据,如表、索引和表列;
元数据存放在InnoDB系统表空间中;
由于历史原因,数据字典元数据在一定程度上与存储在InnoDB表的.frm文件中的信息重叠

Doublewrite Buffer:
双写缓冲区hi一个位于系统表空间的存储区域;
InnoDB在进行刷脏操作的时候,在将脏数据写入数据文件中的正确位置之前,先把脏页从InnoDB缓冲池写入双写缓冲区中。
只有将脏页成功写入并落盘到ibdata1共享表空间中的双写缓冲区之后,InnoDB才能将脏页从缓冲池中写入数据文件中的正确位置。
如果操作系统、存储子系统或者mysqld进程在刷新脏页过程中发生崩溃,那么可能发生部分写(InnoDB默认的页大小为16KB,而文件系统默认的块大小为4KB,则可能导致数据也值写入了一部分到磁盘中):
InnoDB在重新启动的时候的崩溃恢复期间,从双写缓冲区中找到正确的页面副本进行覆盖恢复。
虽然双写会导致脏页被两次写入磁盘,但双写缓冲区不需要两倍的IO开销或者两倍的IO操作,因为脏页在双写时是以一次1MB,作为一个大的顺序块被写入双写缓冲区中,并执行一次fsync()调用的。

如果系统表空间文件(ibdata文件)被存放在支持原子写入的Fusion-IO设备上,则会自动禁用双写缓冲区功能,并将Fusion-IO原子写入功能用于所有数据文件。

注意:
由于双写缓冲区的设置参数:innodb_doublewrite,是全局的,因此对于存放挂在非Fusion-IO设备上的数据文件,也会禁用双写缓冲区功能,对于这部分数据文件,可能造成部分写;
所以,原子写功能仅仅在Fusion-io设备上,且Linux中启用了Fusion-io NVMFS的时候生效;
要充分利用该功能,建议将参数:innodb_flush_method设为:O_DIRECT

Undo Logs:
用于存放事务修改之前的旧数据,基于undo实现了MVCC和一致性非锁定读;
undo log记录了有关如何撤销事务对聚集索引记录的最新更改的信息;

InnoDB总共支持128个回滚段,每个回滚段有1023个事务槽位,在并行事务场景中,一个事务草对应一个事务;
其中32个回滚段位于临时表空间(Temporary Tablespace),也就是说对临时表操作的最大并行事务数量大约为:32*1023个;
其中96个回滚段位于非临时表空间,也就是说对非临时表操作的最大并行事务数大约96*1023个:
系统表空间至少一个,因为MySQL 5.7新增的在线undo truncate功能需要)
Undo Tablespace最多95个

File-Per-Table Tablespaces
设置参数innodb_file_per_table=1启用独立表空间的时候,每个表会对应生成一个.bd文件用于存放自己的索引和数据等;
否则,在创建表的时候,数据和索引将会被存放在ibdata系统表空间文件中;

General Tablespaces
常规表空间,在datadir路径下使用create tablespace语法创建的InnoDB共享表空间(tablespace_name.ibd);
可以在MySQL的datadir之外创建,能够保存多个表,并支持所有行格式的表;
使用下列语法创建,或者将表添加到常规表空间中(该功能是MySQL 5.7新增的):

create table tbl_name ... tablespace [=] tablespace_name
alter table tbl_name tablespace [=] tablespace_name

Undo Tablespace:Undo表空间
包含一个或多个Undo Log文件,文件个数由配置参数innodb_undo_tablespaces控制;

Temporary Tablespace:临时表空间
用于存放非压缩的InnoDB临时表和相关对象;
配置参数innodb_temp_data_file_path为临时表空间的数据文件定义了相对路径和初始大小等;
如果没有设置innodb_temp_data_file_path参数,那么会在数据目录中创建一个名为ibtmp1的自动扩展的12MB初始大小的文件;
临时表空间文件在服务器每次重启的时候都会重新创建,并使用动态生成的空间标识ID来避免与现有空间标识ID冲突;
正常停止或终止初始化的时候都会自动删除,但是发生崩溃的时候,不会自动删除;

在information_schema.innodb_temp_table_info表中可以查看有关InnoDB临时表的元数据;
可以看到InnoDB实例中处于活动状态的所有用户和系统创建的临时表;
注意:
如果无法创建临时表空间,则Server将启动失败,该功能是MySQL 5.7新增的

Redo Log:重做日志
重做日志是在崩溃恢复期间使用的基于磁盘的数据结构文件,用于恢复不完整提交事务写入的数据;
在MySQL实例正常运行期间,重做日志对事务产生的数据变更部分进行编码并持久化到磁盘中;
重做日志中的数据就是对受影响的行记录进行编码,利用这些编码数据把事务进行前滚操作就叫做重做;
在默认情况下,重做日志在磁盘中创建一组名为ib_logfile0和ib_logfile1的文件;
MySQL以循环滚动方式写入重做日志文件,并使用一个不断增加的LSN值表示重做日志的写入量,以及标记写入重做日志文件中的位置;
根据WAL(Write-Ahead Logging,日志先行)原则,在提交事务的时候,会先使用Redo Log持久化事务发生修改的部分数据;
只要redo log落盘并打上commit标记,就表示事务已经持久化。


一个UPDATE语句的执行流程:

高清版本可以下载PDF:

链接:https://pan.baidu.com/s/1yKtlfrIKKH8BBxcvc4NX7w
提取码:mavt
–来自百度网盘超级会员V7的分享


InnoDB存储引擎的后台线程

MySQL是一个单进程多线程架构的数据库管理系统;
所以,当MySQL启动后,你只会看到一个进程:mysqld,但是会存在众多的线程来做各式各样的事情。

查询MySQL的所有线程:

mysql> desc performance_schema.threads;
+---------------------+---------------------+------+-----+---------+-------+
| Field               | Type                | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+-------+
| THREAD_ID           | bigint(20) unsigned | NO   |     | NULL    |       |
| NAME                | varchar(128)        | NO   |     | NULL    |       |
| TYPE                | varchar(10)         | NO   |     | NULL    |       |
| PROCESSLIST_ID      | bigint(20) unsigned | YES  |     | NULL    |       |
| PROCESSLIST_USER    | varchar(16)         | YES  |     | NULL    |       |
| PROCESSLIST_HOST    | varchar(60)         | YES  |     | NULL    |       |
| PROCESSLIST_DB      | varchar(64)         | YES  |     | NULL    |       |
| PROCESSLIST_COMMAND | varchar(16)         | YES  |     | NULL    |       |
| PROCESSLIST_TIME    | bigint(20)          | YES  |     | NULL    |       |
| PROCESSLIST_STATE   | varchar(64)         | YES  |     | NULL    |       |
| PROCESSLIST_INFO    | longtext            | YES  |     | NULL    |       |
| PARENT_THREAD_ID    | bigint(20) unsigned | YES  |     | NULL    |       |
| ROLE                | varchar(64)         | YES  |     | NULL    |       |
| INSTRUMENTED        | enum('YES','NO')    | NO   |     | NULL    |       |
+---------------------+---------------------+------+-----+---------+-------+
14 rows in set (0.00 sec)

mysql>
mysql> select thread_id,name,type,processlist_id,processlist_user,processlist_host,processlist_db,processlist_state from performance_schema.threads;
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------+-------------------+
| thread_id | name                                   | type       | processlist_id | processlist_user | processlist_host | processlist_db | processlist_state |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------+-------------------+
|         1 | thread/sql/main                        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         2 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         3 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         4 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         5 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         6 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         7 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         8 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|         9 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        10 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        11 | thread/innodb/io_handler_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        12 | thread/innodb/srv_monitor_thread       | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        13 | thread/innodb/srv_master_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        15 | thread/innodb/srv_lock_timeout_thread  | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        16 | thread/innodb/srv_purge_thread         | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        17 | thread/innodb/srv_error_monitor_thread | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        18 | thread/innodb/page_cleaner_thread      | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        19 | thread/sql/signal_handler              | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL              |
|        24 | thread/sql/one_connection              | FOREGROUND |              5 | root             | localhost        | NULL           | Sending data      |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------+-------------------+
19 rows in set (0.00 sec)

mysql>

来看看上面的线程:

thread/sql/main                        # BACKGROUND
          /signal_handler              # BACKGROUND
          /one_connection              # FOREGROUND
thread/innodb/io_handler_thread        # BACKGROUND
             /page_cleaner_thread      # BACKGROUND
             /srv_monitor_thread       # BACKGROUND
             /srv_master_thread        # BACKGROUND
             /srv_lock_timeout_thread  # BACKGROUND
             /srv_purge_thread         # BACKGROUND
             /srv_error_monitor_thread # BACKGROUND
线程名说明备注
srv_master_threadInnoDB存储引擎主线程
由四个循环组成:
1. 主循环(loop)
2. 后台循环(background loop)
3. 刷新循环(flush loop)
4. 暂停循环(suspend loop)
——————
其中大多数工作都是在主循环中完成的,主循环主要负责:
1. 将脏缓存页刷新到数据文件中
2. 执行undo purge操作
3. 触发检查点
4. 合并插入缓冲区
5. 刷新redo log到磁盘中
6. 等等
io_ibuf_thread插入缓冲线程
主要负责插入缓冲区的合并操作;
将对辅助索引页的修改操作,从随机变成顺序IO,大幅度提升效率;
1. 发生修改的索引页是否在缓冲池中
2. 如果在,则直接修改
3. 如果不在,则先存放在一个Change Buffer对象中
4. 当其他读取操作把该修改对应的页,从磁盘读取到缓冲池的时候,就会合并该Change Buffer对象中保存的记录,到辅助索引页中
io_read_thread读IO操作线程
io_write_thread写IO操作线程
io_log_thread日志线程
srv_purge_threadundo清理线程
srv_lock_timeout_thread锁线程
srv_error_monitor_thread错误监控线程
page_cleaner_thread脏页清理线程
thread_timer_notifier计时器过期通知线程
main主线程
srv_monitor_threadInnoDB监控打印线程
srv_worker_threadInnoDB工作线程
buffer_dump_threadInnoDB缓冲池导入/导出线程
dict_stats_threadInnoDB后台统计线程
signal_handler信号处理线程

InnoDB存储引擎的前台线程

线程名说明备注
compress_gtid_tableGTID压缩线程
one_connection用户链接线程
slave_ioIO线程
slave_sqlSQL线程
slave_worker工作线程

前台线程还有很多,以上的表格是在MySQL复制(Replicate)架构中的前台线程。


1 thought on “读书笔记《MySQL性能优化金字塔法则》:3.MySQL体系结构”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

隐藏
变装