千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.7 MySQL前台线程

跟MySQL后台线程类似,我们也可以通过performance_schema.threads表来查询MySQL中有哪些前台线程(以下为双主复制架构数据库实例中的查询结果)。

mysql> select name, type, thread_id, processlist_id from performance_schema.threads where type='FOREGROUND';
+----------------------------------+----------+----------+---------------+
| name                             | type     | thread_id | processlist_id |
+----------------------------------+----------+----------+---------------+
| thread/sql/compress_gtid_table    |FOREGROUND|       50 |             7 |
| thread/sql/one_connection         |FOREGROUND|       52 |             9 |
......
| thread/sql/slave_io              |FOREGROUND|       54 |            11 |
| thread/sql/slave_sql             |FOREGROUND|       55 |            12 |
| thread/sql/slave_worker          |FOREGROUND|       56 |            13 |
......
+----------------------------------+----------+----------+---------------+
9 rows in set(0.00 sec)

我们可以看到,有5种前台线程,这些前台线程的主要功能如下。

● compress_gtid_table(GTID压缩线程):用于压缩MySQL 5.7新增的mysql.gtid_executed表中的GTID记录数量。在MySQL 5.7版本中,当从库关闭log-bin或者log_slave_updates参数之后,SQL线程每应用一个事务就会实时更新一次mysql.gtid_executed表(在MySQL 5.7中启用GTID复制时可以关闭log_slave_updates参数,使用该表来记录GTID。但在MySQL 5.6中由于没有此表,所以不能关闭log_slave_updates参数),时间一长,该表中就会存在大量的GTID记录(每个事务一行),使用该线程可以把多行记录压缩成一行。

● one_connection(用户连接线程):用于处理用户请求的线程。

● slave_io(I/O线程):用于拉取主库binlog日志的线程。

● slave_sql(SQL线程):用于应用从主库拉取的binlog日志的线程。注意:在多线程复制中,该线程为协调器线程,用于分发binlog日志给工作线程(slave_worker)应用,并对多个工作线程进行协调。

● slave_worker(工作线程):在多线程复制场景中,接收并应用SQL线程(slave_sql)分发的主库binlog日志,多个工作线程之间的一致性依靠SQL线程(slave_sql)进行协调。