前言: 咱们经常使用 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
状态,可能会发生如下操做:
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开始调用此状态。