10.14.3 一般线程状态
以下列表描述了与一般查询处理相关的线程State
值,而不是更为特殊的活动,如复制。这些值中许多只有在服务器中找到bug时才有用。
-
线程在创建表(包括内部临时表)时结束函数的末尾,这个状态即使表不能被创建也会使用。
-
服务器正在执行一个在-place
ALTER TABLE
语句。 -
线程正在计算一个
MyISAM
表键分布(例如,用于ANALYZE TABLE
语句)。 -
线程正在检查服务器是否具有执行语句所需的权限。
-
线程正在执行表检查操作。
-
线程已经处理了一条命令,正在准备释放内存并重置某些状态变量。
-
线程正在将更改的表数据刷新到磁盘上,并关闭已使用的表。这个操作应该很快。如果不是,请验证您没有满磁盘,也没有磁盘非常繁忙。
-
committing alter table to storage engine
服务器已经完成了在-place
ALTER TABLE
操作,并正在提交结果。 -
线程正在将内部临时表从
MEMORY
表转换为磁盘表。 -
线程正在处理
ALTER TABLE
语句。这一状态发生在创建了具有新结构的表但还没有将行复制到其中时。在该状态的线程中,可以使用性能_schema来获取复制操作的进度信息。请参阅第29.12.5节,“性能_schema阶段事件表”。
-
Copying to group table
如果语句具有不同的
ORDER BY
和GROUP BY
标准,行将根据组排序并复制到临时表中。 -
Copying to tmp table
服务器正在将数据复制到内存中的临时表中。
-
Copying to tmp table on disk
服务器正在将数据复制到磁盘上的临时表中。临时结果集已经变得太大(请参阅第10.4.4节,“MySQL内部临时表使用”),因此线程正在将临时表从内存中切换到磁盘格式以保存内存。
-
Creating index
线程正在处理
ALTER TABLE ... ENABLE KEYS
语句对MyISAM表的操作。 -
Creating sort index
线程正在处理一个
SELECT
语句,该语句使用内部临时表进行解析。 -
线程正在创建一个表。这包括临时表的创建。
-
线程正在在内存或磁盘上创建一个临时表。如果该表是在内存中创建的,但后来被转换为磁盘表,那么该操作的状态是
将 tmp 表复制到磁盘
。 -
服务器正在执行多表删除的第一部分。它只从第一个表中删除,并保存将用于删除其他(引用)表的列和偏移量。
-
服务器正在执行多表删除的第二部分,并从其他表中删除匹配行。
-
线程正在处理一个
ALTER TABLE ... DISCARD TABLESPACE
或ALTER TABLE ... IMPORT TABLESPACE
语句。 -
在
ALTER TABLE
、CREATE VIEW
、DELETE
、INSERT
、SELECT
或UPDATE
语句执行完成,但在清理前。在
end
状态下,可能发生以下操作:-
将事件写入二进制日志
-
释放内存缓冲区,包括blob类型的缓冲区
-
-
线程已经开始执行语句。
-
线程正在执行
init_command
系统变量的值中的语句。 -
线程已经执行了命令。这状态通常后面跟着
cleaning up
。 -
服务器正在准备执行自然语言全文搜索。
-
这发生在
ALTER TABLE
、DELETE
、INSERT
、SELECT
或UPDATE
语句之前。服务器在这个状态下执行的操作包括刷新二进制日志和InnoDB
日志。 -
有人发送了
KILL
语句到线程,它将在下一次检查杀死标志时中止。服务器每次进行主要循环都检查杀死标志,但是在某些情况下,线程可能还需要短暂时间才能死亡。如果线程被其他线程锁定,kill的效果将在其他线程释放其锁定后生效。 -
线程尝试锁定系统表(例如时区或日志表)。
-
线程正在将语句写入到慢查询日志中。
-
连接线程的初始状态,直到客户端成功身份验证。
-
服务器正在启用或禁用表索引。
-
线程尝试打开系统表(例如时区或日志表)。
-
线程尝试打开表。这应该是一个非常快速的过程,除非某些事情阻止了打开。例如,
ALTER TABLE
或LOCK TABLE
语句可以阻止打开表直到语句完成。也值得检查您的table_open_cache
值是否足够大。对于系统表,使用
Opening system tables
状态。 -
服务器正在对查询进行初始优化。
-
该状态在查询优化期间发生。
-
服务器正在准备执行一个在-place
ALTER TABLE
语句。 -
线程正在删除不需要的中继日志文件。
-
该状态在处理查询后,但是在
freeing items
状态之前发生。 -
服务器正在从客户端读取一个数据包。
-
该查询使用了
SELECT DISTINCT
方式,使得 MySQL 无法在早期阶段优化去除distinct操作。因此,MySQL 需要额外的阶段来删除所有重复行,然后将结果发送给客户端。 -
线程正在处理一个
SELECT
语句,删除了内部临时表。如果没有创建临时表,则不使用该状态。 -
线程正在重命名一个表。
-
线程正在处理一个
ALTER TABLE
语句,已经创建了新表,并且正在将其重命名以替换原始表。 -
线程获取了表的锁,但是在获取锁后发现底层表结构已经改变。它已经释放了锁,关闭了表,并且正在尝试重新打开它。
-
修复代码正在使用排序来创建索引。
-
线程已经完成了多线程MyISAM表的修复操作。
-
修复代码正在通过键缓存创建键一个个。这个过程比
Repair by sorting
慢得多。 -
线程正在回滚事务。
-
对于MyISAM表的修复或分析操作,线程正在将新的表状态保存到
.MYI
文件头中。状态包括行数、AUTO_INCREMENT计数器和键分布信息等。 -
线程正在执行首阶段,以找到所有匹配行,然后更新它们。这需要在
UPDATE
语句中更改使用的索引时。 -
Sending data
这个状态现在已经包含在
Executing
状态中。 -
服务器正在将包写入客户端。
-
线程正在开始一个
ALTER TABLE
操作。 -
线程正在对一个
GROUP BY
进行排序。 -
线程正在对一个
ORDER BY
进行排序。 -
线程正在对
MyISAM
表进行索引排序,以便在优化操作中更快速访问。 -
语句执行的初始阶段。
-
服务器正在计算统计数据以开发查询执行计划。如果线程在这个状态下花费了很长时间,服务器可能是磁盘瓶颈进行其他工作。
-
线程已经调用了
mysql_lock_tables()
,但自从那以来线程状态没有被更新。这是一个非常通用的状态,可以由于许多原因而发生。例如,线程将请求或等待内部或外部系统锁定表。这种情况可能发生在
InnoDB
执行LOCK TABLES
时,等待表级锁定。如果这状态是由外部锁请求引起的,并且您不使用多个mysqld服务器访问同一个MyISAM
表,您可以使用--skip-external-locking
选项禁用外部系统锁定。然而,外部锁定默认被禁用,所以这选项可能没有效果。在SHOW PROFILE
中,这状态表示线程正在请求锁定(而不是等待它)。对于系统表,使用
Locking system tables
状态。 -
线程正在准备开始更新表。
-
线程正在搜索要更新的行并更新它们。
-
服务器正在执行多表更新的第一部分。它只更新第一个表,并保存用于更新其他(参考)表的列和偏移量。
-
服务器正在执行多表更新的第二部分,并更新与其他表匹配的行。
-
线程将请求或正在等待使用
GET_LOCK()
调用的建议锁。对于SHOW PROFILE
,这个状态表示线程正在请求锁(而不是等待它)。 -
线程已经调用了
SLEEP()
调用的函数。 -
FLUSH TABLES WITH READ LOCK
正在等待提交锁。 -
线程正在等待事务提交,而不是其他查询处理部分。
-
线程收到通知,表的 underlying 结构已经改变,它需要重新打开该表以获取新的结构。但是,以便重新打开该表,它必须等待所有其他线程关闭该表。
如果另一个线程在该表上执行了
FLUSH TABLES
或以下语句之一,该通知将发生:FLUSH TABLES
,tbl_name
ALTER TABLE
,RENAME TABLE
,REPAIR TABLE
,ANALYZE TABLE
或OPTIMIZE TABLE
。 -
线程正在执行
FLUSH TABLES
,等待所有线程关闭表或线程收到通知说某个表的结构已经改变需要重新打开该表以获取新的结构。但是,为了重新打开该表,它必须等待其他所有线程都关闭该表。如果另一个线程在该表上执行了
FLUSH TABLES
或以下语句之一,该通知将发生:FLUSH TABLES
,tbl_name
ALTER TABLE
,RENAME TABLE
,REPAIR TABLE
,ANALYZE TABLE
或OPTIMIZE TABLE
。 -
服务器正在等待获取THR_LOCK锁或元数据锁定子系统的锁,
lock_类型
表示锁的类型。这个状态表示对THR_LOCK锁的等待:
-
等待表级锁
这些状态表示元数据锁的等待:
-
等待事件元数据锁
-
等待全局读锁
-
等待架构元数据锁
-
等待存储函数元数据锁
-
等待存储过程元数据锁
-
等待表元数据锁
-
等待触发器元数据锁
关于表锁指示器的信息,请见第10.11.1节,“内部锁定方法”。关于元数据锁定的信息,请见第10.11.4节,“元数据锁定”。要查看哪些锁阻塞了锁请求,请使用性能chema锁表,详见第29.12.13节,“性能schema锁表”。
-
-
Waiting on cond
一个通用的状态,在该状态下线程等待某个条件变为真。没有可用状态信息。
-
Writing to net
服务器正在将包写入网络。