mysql> use performance_schema
mysql> select name,count(*) from threads group by name;
+----------------------------------------+----------+
| name | count(*) |
+----------------------------------------+----------+
| thread/innodb/buf_dump_thread | 1 |
| thread/innodb/dict_stats_thread | 1 |
| thread/innodb/io_ibuf_thread | 1 |
| thread/innodb/io_log_thread | 1 |
| thread/innodb/io_read_thread | 4 |
| thread/innodb/io_write_thread | 4 |
| thread/innodb/page_cleaner_thread | 1 |
| thread/innodb/srv_error_monitor_thread | 1 |
| thread/innodb/srv_lock_timeout_thread | 1 |
| thread/innodb/srv_master_thread | 1 |
| thread/innodb/srv_monitor_thread | 1 |
| thread/innodb/srv_purge_thread | 1 |
| thread/innodb/srv_worker_thread | 3 |
| thread/sql/compress_gtid_table | 1 |
| thread/sql/main | 1 |
| thread/sql/one_connection | 1 |
| thread/sql/signal_handler | 1 |
| thread/sql/thread_timer_notifier | 1 |
+----------------------------------------+----------+
Master主线程
1、 Master thread线程的优先级最高,内部主要是4个循环loop组成:主循环、后台循环、刷新循环、暂停循环。
2、在master thread线程里,每1秒或每10秒会触发1oop(循环体)工作,loop为主循环,大多数情况下都运行在这个循环体。 loop通过sleep()来实现定时的操作,所以操作时间不精准。负载高的情况下可能会有延迟;
3、dirty page:当事务(Transaction)需要修改某条记录(row)时,InnoDB需要将该数据所在的page从disk读到buffer pool中,事务提交后,InnoDB修改page中的记录(row)。这时buffer pool中的page就已经和disk中的不一样了,我们称buffer pool中的被修改过的page为dirty page。 Dirty page等待flush到disk上。
4、insert buffer merge:
innodb使用insert buffer” 欺骗”数据库:对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把若干对同一页面的更新缓存起来做合并(merge)为一次性更新操作,转化随机IO为顺序IO,这样可以避免随机IO带来性能损耗,提高数据库的写性能。
(1)Insert Buffer是Innodb处理非唯一索引更新操作时的一个优化。最早的Insert Buffer,仅仅实现Insert操作的Buffer,这也是Insert Buffer名称的由来。在后续版本中,Innodb多次对Insert Buffer进行增强,到Innodb 5.5版本,Insert Buffer除了支持Insert,还新增了包括Update/Delete/Purge等操作的buffer功能,Insert Buffer也随之更名为Change Buffer。
(2)insert buffer merge分为主动给merge和被动merge。
(2.1)master thread线程里的insert buffer merge是主动merge,原理是:
a、若过去1秒内发生的IO小于系统IO能力的5%,则主动进行一次insert buffer merge(merge的页面数为系统IO能力的5%且读取page采用async io模式)。
b、每10秒,必须触发一次insert buffer merge(merge的页面数仍旧为系统IO能力的5%)