show processlist 命令详解

如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的 MySQL 帐户运行的线程)。

mysql> show processlist;

+—–+————-+——————–+

| Id | User | Host | db | Command | Time| State | Info

+—–+————-+——————–+

|207|root |192.168.0.2:51621 |mytest | Sleep | 5 | | NULL

|208|root |192.168.0.2:51622 |mytest | Sleep | 5 | | NULL

|220|root |192.168.0.2:51676 |mytest |Query | 84 | locked |

select name,culture,value,type from book where id=1

 

说明各列的含义和用途,

id列:一个标识,你要kill 一个语句的时候很有用。

user列: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。

host列:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户。

db列:显示这个进程目前连接的是哪个数据库

command列:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。

 通常代表资源未释放,如果是通过连接池,sleep状态应该恒定在一定数量范围内

 实战范例:因前端数据输出时(特别是输出到用户终端)未及时关闭数据库连接,导致因网络连接速度产生大量sleep连接,在网速出现异常时,数据库too many connections挂死。

 简单解读,数据查询和执行通常只需要不到0.01秒,而网络输出通常需要1秒左右甚至更长,原本数据连接在0.01秒即可释放,但是因为前端程序未执行close操作,直接输出结果,那么在结果未展现在用户桌面前,该数据库连接一直维持在sleep状态!

time列:此这个状态持续的时间,单位是秒。

state列:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成。

info列:显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。 

这个命令中最关键的就是state列,mysql列出的状态主要有以下几种:

Checking table

正在检查数据表(这是自动的)。

Closing tables

正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。

Connect Out

复制从服务器正在连接主服务器。

Copying to tmp table on disk

 由于临时结果集大于 tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。

 索引及现有结构无法涵盖查询条件,才会建立一个临时表来满足查询要求,产生巨大的恐怖的i/o压力。

 很可怕的搜索语句会导致这样的情况,如果是数据分析,或者半夜的周期数据清理任务,偶尔出现,可以允许。频繁出现务必优化之。

 Copy to tmp table通常与连表查询有关,建议逐渐习惯不使用连表查询。

 实战范例:

 某社区数据库阻塞,求救,经查,其服务器存在多个数据库应用和网站,其中一个不常用的小网站数据库产生了一个恐怖的copy to tmp table操作,导致整个硬盘i/o和cpu压力超载。Kill掉该操作一切恢复。

Creating tmp table

正在创建临时表以存放部分查询结果。

deleting from main table

服务器正在执行多表删除中的第一部分,刚删除第一个表。

deleting from reference tables

服务器正在执行多表删除中的第二部分,正在删除其他表的记录。

Flushing tables

正在执行 FLUSH TABLES,等待其他线程关闭数据表。

Killed

发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。

Locked

 

  被其他查询锁住了。

 

 有更新操作锁定

 

 通常使用innodb(支持行锁定)可以很好的减少locked状态的产生,但是切记,更新操作要正确使用索引,即便是低频次更新操作也不能疏忽。如上影响结果集范例所示。

 

 在myisam的时代,locked是很多高并发应用的噩梦。所以mysql官方也开始倾向于推荐innodb。

 

Sending data

 正在处理 SELECT 查询的记录,同时正在把结果发送给客户端。

 

 Sending data并不是发送数据,别被这个名字所欺骗,这是从物理磁盘获取数据的进程,如果你的影响结果集较多,那么就需要从不同的磁盘碎片去抽取数据,

 

 偶尔出现该状态连接无碍。

 

 回到上面影响结果集的问题,一般而言,如果sending data连接过多,通常是某查询的影响结果集过大,也就是查询的索引项不够优化。

 

 如果出现大量相似的SQL语句出现在show proesslist列表中,并且都处于sending data状态,优化查询索引,记住用影响结果集的思路去思考。

Sorting for group

正在为 GROUP BY 做排序。

Sorting for order

正在为 ORDER BY 做排序。 

        和Sending data类似,结果集过大,排序条件没有索引化,需要在内存里排序,甚至需要创建临时结构排序  

Opening tables

这个过程应该会很快,除非受到其他因素的干扰。例如,在执 ALTER TABLE 或 LOCK TABLE 语句行完以前,数据表无法被其他线程打开。 正尝试打开一个表。

Removing duplicates

正在执行一个 SELECT DISTINCT 方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。

Reopen table

获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。

Repair by sorting

修复指令正在排序以创建索引。

Repair with keycache

修复指令正在利用索引缓存一个一个地创建新索引。它会比 Repair by sorting 慢些。

Searching rows for update

正在讲符合条件的记录找出来以备更新。它必须在 UPDATE 要修改相关的记录之前就完成了。

Sleeping

正在等待客户端发送新请求.

System lock

正在等待取得一个外部的系统锁。如果当前没有运行多个 mysqld 服务器同时请求同一个表,那么可以通过增加 –skip-external-locking参数来禁止外部系统锁。

Upgrading lock

INSERT DELAYED 正在尝试取得一个锁表以插入新记录。

Updating

正在搜索匹配的记录,并且修改它们。

User Lock

正在等待 GET_LOCK()。

Waiting for tables

该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE。

waiting for handler insert

INSERT DELAYED 已经处理完了所有待处理的插入操作,正在等待新的请求。

 

Waiting for net, reading from net, writing to net

   偶尔出现无妨

   如大量出现,迅速检查数据库到前端的网络连接状态和流量

   案例:因外挂程序,内网数据库大量读取,内网使用的百兆交换迅速爆满,导致大量连接阻塞在waiting for net,数据库连接过多崩溃

大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。还有其它的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着。

转载:https://blog.csdn.net/p656456564545/article/details/53169565

<think>好的,我现在需要处理用户关于MySQL的SHOW PROCESSLIST命令的查询结果解释的问题。用户已经提供了一些相关的引用资料,我需要结合这些资料来生成一个详细且结构清晰的回答。首先,我要回顾用户提供的引用内容,确保准确理解每个引用的重点,并正确引用到回答中。 首先,用户引用了五条参考资料,其中: - 引用1提到SHOW PROCESSLIST不能使用过滤查找,可能是因为MySQL的内部安全机制,并指出processlist用于查看内部运行数据[^1]。 - 引用2解释了一个SELECT DISTINCT查询的状态,说明MySQL需要处理重复记录[^2]。 - 引用3提供了SHOW PROCESSLIST的基本用法,包括如何查询状态、使用FULL选项、从information_schema中筛选,以及KILL命令的使用方法[^3]。 - 引用4给出了一个具体的查询示例,显示用户执行了SHOW FULL PROCESSLIST[^4]。 - 引用5提到command列的可能取值,如sleep、query、connect等[^5]。 接下来,我需要根据这些信息,组织回答的结构。用户的问题是关于SHOW PROCESSLIST结果的详细解释,所以需要逐个字段说明每个列的含义,并结合引用内容进行补充。例如,Id、User、Host、db、Command、Time、State、Info等列。 在整理过程中,需要注意以下几点: 1. 每个列的解释需要准确,可能结合引用中的例子,如引用2中的SELECT DISTINCT查询对应的State列状态。 2. 引用3中提到可以使用information_schema.processlist表进行筛选,这可能需要在注意事项部分提到。 3. 引用5中的command列取值需要在对应的Command列解释中引用。 4. 用户提供的示例查询结果(如引用4中的示例)可以作为实际示例引用。 5. 需要确保引用的正确标注,如引用1关于过滤查找的限制,可能在注意事项中提到,并标注对应的引用标记。 然后,我需要考虑用户可能的相关问题,根据引用内容生成相关问题。例如,如何筛选非Sleep进程(引用3中的查询),如何终止查询(引用3中的KILL命令),或者不同State值的含义(如引用2中的例子)。 在写作过程中,要确保使用正确的中文表达,数学公式或代码块使用正确的格式。例如,代码块需要用反引号包裹,独立公式使用$$...$$,但在这个回答中可能涉及代码示例,如SQL查询,需要正确格式化。 最后,检查回答是否符合用户的要求:结构清晰、分步骤解释、引用正确标注,并生成相关问题。同时确保没有使用Markdown格式,行内公式正确使用$...$,尽管当前问题可能不涉及数学公式,但需注意其他格式要求。 现在,我需要将这些思考整合成一个连贯的回答,确保每个部分的信息准确,引用正确,并且语言自然流畅,符合中文表达习惯。</think>### SHOW PROCESSLIST 结果详解 MySQL的`SHOW PROCESSLIST`命令用于查看当前数据库连接的线程状态,帮助诊断性能问题或排查异常操作。以下是各列的含义及实际应用场景: --- #### 1. **Id** 表示连接的唯一标识符(线程ID)。通过该值可以执行`KILL [Id]`终止特定连接[^3]。 --- #### 2. **User** 显示当前连接的用户名。例如:`root`表示管理员用户,普通用户可能显示应用账号[^4]。 --- #### 3. **Host** 显示客户端连接的来源地址和端口。例如:`192.168.100.1:5152`表示来自IP为192.168.100.1的客户端,使用端口5152。 --- #### 4. **db** 当前连接默认使用的数据库名称。若未选择数据库,显示`NULL`。 --- #### 5. **Command** 描述线程当前执行的命令类型,常见值包括: - `Sleep`:连接空闲,等待新请求。 - `Query`:正在执行SQL语句。 - `Connect`:客户端正在建立连接。 - `Binlog Dump`:主从复制中的二进制日志传输。 --- #### 6. **Time** 显示当前状态已持续的时间(单位:秒)。例如:`0`表示刚启动,`120`表示已执行2分钟。 --- #### 7. **State** 线程的详细状态,常见值包括: - `Sending data`:正在从存储引擎读取数据并发送给客户端。 - `Sorting result`:对查询结果进行排序。 - `Locked`:等待表锁(常见于MyISAM引擎)。 - `init`:线程初始化中[^4]。 - `Removing duplicates`:处理`SELECT DISTINCT`去重操作[^2]。 --- #### 8. **Info** 显示正在执行的SQL语句前100个字符。使用`SHOW FULL PROCESSLIST`可查看完整语句[^3]。 --- ### 注意事项 1. **结果筛选** 直接使用`SHOW PROCESSLIST`无法过滤结果,但可通过查询`information_schema.processlist`表实现筛选,例如: ```sql SELECT * FROM information_schema.processlist WHERE command != 'Sleep'; ``` [^3] 2. **终止连接** 使用`KILL [Id]`终止连接,或`KILL QUERY [Id]`仅终止当前查询[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值