作者:頃刻想詤嗳伱kYU-2001 | 来源:互联网 | 2023-07-28 10:32
###概述在MySQL中,存在有各种各样的线程,每种线程又各有各自的功能##线程划分我们可以通过showengineinnodbstatus\G来查看mysql
概述
在MySQL中,存在有各种各样的线程,每种线程又各有各自的功能
线程划分
我们可以通过show engine innodb status\G来查看mysql中的线程
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 4 srv_active, 0 srv_shutdown, 120974 srv_idle
srv_master_thread log flush and writes: 120978
首先是主线程,master线程每秒会定时执行一次。
srv_active:主线程active的状态,每当有更新、删除、插入,数据表相关的操作的时候,就会增加
srv_shutdown:在shutdown时增加
srv_idle:线程空闲时增加
log flush and writes:主线程定期刷新redo日志,和参数innodb_flush_log_at_timeout有关,控制刷新时间
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
其次是io线程,对于大多数的io线程来说,在刷新到硬盘数据时,都是使用fsync()来同步刷新
这些线程有插入缓冲线程,主要管理内存中的增删改和索引合并数据,在等到一个合适的机会刷新到硬盘。日志缓冲刷新线程,和innodb_flush_log_at_timeout有关。读写的io线程,是最基本的线程
Purge线程:主要用来清理undo log,可以通过参数innodb_purge_threads来设置线程数。在undo表空间满的时候,或无法为当前事物分配undo slot的时候,会执行truncate操作。
最后是刷脏线程,由参数innodb_page_cleaners控制线程数。
总体来说,所有的线程数最好不要超过cpu核心数,否则cpu会进行时间分片,后果就是严重的性能下降