MySQL线程状态详解

前言: 咱们经常使用 show processlist show full processlist 查看数据库链接状态,其中比较关注的是 State 列,此列表示该链接此刻所在的状态。那么你真的了解不一样 State 值所表示的状态吗?下面咱们参考官方文档来一探究竟 。html

以MySQL 5.7版本为例
官方文档地址: https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html mysql

简单翻译下: sql

    • After create 数据库

      当线程在建立表的函数末尾建立表(包括内部临时表)时,会发生这种状况。即便因为某些错误而没法建立表,也会使用此状态。 缓存

    • Analyzing 服务器

      线程正在计算 MyISAM 表键分布(例如,for ANALYZE TABLE )。 网络

    • checking permissions 多线程

      线程正在检查服务器是否具备执行语句所需的权限。 函数

    • Checking table 性能

      该线程正在执行表检查操做。

    • cleaning up

      该线程已经处理了一个命令,并准备释放内存并重置某些状态变量。

    • closing tables

      该线程正在将更改的表数据刷新到磁盘并关闭已使用的表。这应该是一个快速的操做。若是没有,请验证您的磁盘空间剩余。

    • converting HEAP to ondisk

      该线程正在将内部临时表从 MEMORY 表转换为磁盘表。

    • copy to tmp table

      线程正在处理一个 ALTER TABLE 语句。在建立具备新结构的表但在将行复制到其中以前,将发生此状态。

      对于处于此状态的线程,可使用性能模式来获取有关复制操做的进度。

    • Copying to group table

      若是语句具备不一样的条件 ORDER BY GROUP BY 标准,则按组对行进行排序并将其复制到临时表。

    • Copying to tmp table

      服务器正在复制到内存中的临时表。

    • altering table

      服务器正在执行就地 ALTER TABLE

    • Copying to tmp table on disk

      服务器正在复制到磁盘上的临时表。

    • Creating index

      线程正在处理 ALTER TABLE ... ENABLE KEYS 一个 MyISAM 表。

    • Creating sort index

      线程正在处理 SELECT 使用内部临时表解析的线程 。

    • creating table

      线程正在建立一个表。这包括建立临时表。

    • Creating tmp table

      该线程正在内存或磁盘上建立临时表。若是表在内存中建立但稍后转换为磁盘表,则该操做期间的状态将为 Copying to tmp table on disk

    • committing alter table to storage engine

      服务器已完成就地 ALTER TABLE 并提交结果。

    • deleting from main table

      服务器正在执行多表删除的第一部分。它仅从第一个表中删除,并保存用于从其余(引用)表中删除的列和偏移量。

    • deleting from reference tables

      服务器正在执行多表删除的第二部分,并从其余表中删除匹配的行。

    • discard_or_import_tablespace

      线程正在处理 ALTER TABLE ... DISCARD TABLESPACE ALTER TABLE ... IMPORT TABLESPACE 声明。

    • end

      这发生在结束,但的清理以前 ALTER TABLE CREATE VIEW DELETE INSERT SELECT ,或 UPDATE 语句。

    • executing

      该线程已开始执行语句。

    • Execution of init_command

      线程正在执行 init_command 系统变量值中的语句 。

    • freeing items

      线程执行了一个命令。在此状态期间完成的一些项目的释放涉及查询缓存。这种状态一般紧随其后 cleaning up

    • FULLTEXT initialization

      服务器正准备执行天然语言全文搜索。

    • init

      出现这种状况的初始化以前 ALTER TABLE DELETE INSERT SELECT ,或 UPDATE 语句。服务器在此状态下采起的操做包括刷新二进制日志, InnoDB 日志和一些查询缓存清理操做。

      对于 end 状态,可能会发生如下操做:

      • 删除表中的数据后删除查询缓存条目
      • 将事件写入二进制日志
      • 释放内存缓冲区,包括blob
    • Killed

      有人 KILL 向线程发送了一个语句,它应该在下次检查kill标志时停止。在MySQL的每一个主循环中检查该标志,但在某些状况下,线程可能仍然须要很短的时间才能死掉。若是线程被某个其余线程锁定,则一旦另外一个线程释放其锁定,kill就会生效。

    • logging slow query

      该线程正在向慢查询日志写一条语句。

    • login

      链接线程的初始状态,直到客户端成功经过身份验证。

    • manage keys

      服务器正在启用或禁用表索引。

    • NULL

      该状态用于该 SHOW PROCESSLIST 状态。

    • Opening tables

      线程正在尝试打开一个表。这应该是很是快的程序,除非有什么东西阻止打开。例如,一个 ALTER TABLE 或一个 LOCK TABLE 语句能够阻止在语句结束以前打开表。

    • optimizing

      服务器正在对查询执行初始优化。

    • preparing

      在查询优化期间发生此状态。

    • Purging old relay logs

      该线程正在删除不须要的中继日志文件。

    • query end

      处理查询后但在 freeing items 状态以前发生此 状态。

    • Receiving from client

      服务器正在从客户端读取数据包。 Reading from net 在MySQL 5.7.8以前调用此状态。

    • Removing duplicates

      该查询使用 SELECT DISTINCT 的方式是MySQL没法在早期阶段优化掉不一样的操做。所以,在将结果发送到客户端以前,MySQL须要额外的阶段来删除全部重复的行。

    • removing tmp table

      该线程在处理 SELECT 语句后删除内部临时表。若是未建立临时表,则不使用此状态。

    • rename

      该线程正在重命名一个表。

    • rename result table

      线程正在处理一个 ALTER TABLE 语句,建立了新表,并重命名它以替换原始表。

    • Reopen tables

      该线程得到了表的锁定,但在获取锁定以后注意到基础表结构发生了变化。它释放了锁,关闭了桌子,并试图从新打开它。

    • Repair by sorting

      修复代码使用排序来建立索引。

    • preparing for alter table

      服务器正准备执行就地 ALTER TABLE

    • Repair done

      该线程已完成对 MyISAM 表的多线程修复 。

    • Repair with keycache

      修复代码经过密钥缓存逐个建立密钥。这比慢得多 Repair by sorting

    • Rolling back

      该线程正在回滚一个事务。

    • Saving state

      对于 MyISAM 诸如修复或分析的表操做,线程将新表状态保存到 .MYI 文件头。状态包括诸如行数, AUTO_INCREMENT 计数器和密钥分发之类的信息。

    • Searching rows for update

      该线程正在进行第一阶段以在更新以前查找全部匹配的行。若是 UPDATE 要更改用于查找所涉及行的索引,则必须执行此操做。

    • Sending data

      线程正在读取和处理 SELECT 语句的行 ,并将数据发送到客户端。因为在此状态期间发生的操做每每会执行大量磁盘访问(读取),所以它一般是给定查询生命周期中运行时间最长的状态。

    • Sending to client

      服务器正在向客户端写入数据包。 Writing to net 在MySQL 5.7.8以前调用此状态。

    • setup

      线程正在开始一个 ALTER TABLE 操做。

    • Sorting for group

      线程正在进行排序以知足 GROUP BY

    • Sorting for order

      线程正在进行排序以知足 ORDER BY

    • Sorting index

      该线程正在对索引页面进行排序,以便在 MyISAM 表优化操做期间进行更有效的访

    • Sorting result

      对于 SELECT 声明,这相似于 Creating sort index 非临时表。

    • statistics

      服务器正在计算统计信息以开发查询执行计划。若是线程长时间处于此状态,则服务器多是磁盘绑定执行其余工做。

    • System lock

      线程已经调用 mysql_lock_tables() ,而且线程状态还没有更新。这是一个很是广泛的状态,可能因为多种缘由而发生。

      例如,线程将请求或正在等待表的内部或外部系统锁定。 InnoDB 在执行期间等待表级锁定时会 发生这种状况 LOCK TABLES 。若是此状态是由外部锁的请求引发的,而且您没有使用多个访问相同 表的 mysqld 服务器,则 MyISAM 可使用该 --skip-external-locking 选项禁用外部系统锁 。可是,默认状况下禁用外部锁定,所以该选项极可能无效。对于 SHOW PROFILE ,这个状态意味着线程正在请求锁定(不等待它)。

    • update

      线程正准备开始更新表。

    • Updating

      线程正在搜索要更新的行并正在更新它们。

    • updating main table

      服务器正在执行多表更新的第一部分。它仅更新第一个表,并保存用于更新其余(引用)表的列和偏移量。

    • updating reference tables

      服务器正在执行多表更新的第二部分,并更新其余表中的匹配行。

    • User lock

      该线程将要求或正在等待经过 GET_LOCK() 呼叫请求的咨询锁 。对于 SHOW PROFILE ,此状态表示线程正在请求锁定(不等待它)。

    • User sleep

      线程已经调用了一个 SLEEP() 调用。

    • Waiting for commit lock

      FLUSH TABLES WITH READ LOCK 正在等待提交锁定。

    • Waiting for global read lock

      FLUSH TABLES WITH READ LOCK 正在等待全局读锁定或 read_only 正在设置全局 系统变量。

    • Waiting for tables

      线程获得一个通知,代表表的底层结构已经改变,它须要从新打开表以得到新结构。可是,要从新打开表,它必须等到全部其余线程关闭了相关表。

    • Waiting for table flush

      线程正在执行 FLUSH TABLES 而且正在等待全部线程关闭它们的表,或者线程获得一个表的基础结构已经更改的通知,而且它须要从新打开表以获取新结构。可是,要从新打开表,它必须等到全部其余线程关闭了相关表。

    • Waiting for *lock_type* lock

      服务器正在等待 THR_LOCK 从元数据锁定子系统获取 锁定或锁定,其中 lock_type 指示锁定的类型。

      此状态表示等待 THR_LOCK

      • Waiting for table level lock

      这些状态表示等待元数据锁定:

      • Waiting for event metadata lock
      • Waiting for global read lock
      • Waiting for schema metadata lock
      • Waiting for stored function metadata lock
      • Waiting for stored procedure metadata lock
      • Waiting for table metadata lock
      • Waiting for trigger metadata lock
    • Waiting on cond

      线程正在等待条件变为真的通用状态。没有具体的州信息。

    • Writing to net

      服务器正在将数据包写入网络。 Sending to client 从MySQL 5.7.8开始调用此状态。

相关文章
相关标签/搜索