
前言
不知不觉已经 2025 了,23年8月参加工作以来已经 1 年多了,也是公众号创建第117天,大家新年快乐,最近工作比较忙,更新频率降低一些哈,有空就更。
今天简单聊聊 mysql 进程列表的获取方式的 SQL 最大长度问题,话不多说,直接开始测试
show [full] processlist
第一个先看看 show processlist
,这个方式是进程数比较少的时候最好用的方式。
show processlist
有两种语法:
show processlist
show full processlist
如果没有 FULL
关键字,SHOW PROCESSLIST
只会在 Info
字段中显示每个语句的前 100 个字符
生成 100 个字符
root@localhost [(none)] 22:38:43 > SELECT SUBSTRING(REPEAT(MD5(RAND()),5), 1, 100);
+------------------------------------------------------------------------------------------------------+
| SUBSTRING(REPEAT(MD5(RAND()),5), 1, 100) |
+------------------------------------------------------------------------------------------------------+
| 187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
再开一个会话看看能不能显示完全:
root@localhost [(none)] 22:38:44 > show processlist;
+----+-----------------+-----------+------+---------+--------+------------------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+--------+------------------------+------------------------------------------------------------------------------------------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 458029 | Waiting on empty queue | NULL |
| 13 | root | localhost | NULL | Query | 8 | User sleep | select '187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b98 |
| 14 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-----------------+-----------+------+---------+--------+------------------------+------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)
显然并不能。我们再看看 show full processlist;
root@localhost [(none)] 22:41:12 > show full processlist;
+----+-----------------+-----------+------+---------+--------+------------------------+--------------------------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+--------+------------------------+--------------------------------------------------------------------------------------------------------------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 458142 | Waiting on empty queue | NULL |
| 13 | root | localhost | NULL | Query | 2 | User sleep | select '187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d',sleep(100) |
| 14 | root | localhost | NULL | Query | 0 | init | show full processlist |
+----+-----------------+-----------+------+---------+--------+------------------------+--------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
这下可以了。
下面看看 show processlist
获取进程列表的实现方式:
介绍一个 performance_schema_show_processlist 变量:
SHOW PROCESSLIST
语句通过收集所有活动线程的线程数据来提供 process 信息。performance_schema_show_processlist
变量决定使用哪个 SHOW PROCESSLIST
实现:
默认为 OFF ,实现在 thread manager 内遍历活动线程,同时持有 global mutex。这会产生负面的性能后果,尤其是在繁忙的系统上。 设置为 ON 时, SHOW PROCESSLIST
实现基于 Performance Schemaprocesslist
表。此实现从 Performance Schema 而不是 thread manager 查询活动线程数据,并且不需要 mutex,虽然 mutex 是轻量级的但是线程多的时候也会导致性能抖动。
但是需要额外的配置:有关配置的注意事项参考:https://dev.mysql.com/doc/refman/8.0/en/performance-schema-processlist-table.html
最低要求配置:
MySQL 服务器必须在启用线程检测的情况下进行配置和构建。默认情况下是这样;它是使用 DISABLE_PSI_THREAD
CMake选项控制的。Performance Schema 必须在服务器启动时启用。默认情况下是这样;它是使用 performance_schema
系统变量控制的。
如果满足了这些配置要求, performance_schema_show_processlist
会启用或禁用替代的 SHOW PROCESSLIST
实现。如果不满足最低配置,则processlist
表(以及SHOW PROCESSLIST
)可能不会返回所有数据。
总结
简单描述了 show processlist
的最大字符长度和 show processlist
获取进程列表的实现方式。
往期回顾
错误使用 Change master 可能导致数据不一致 如果主从存在延迟,这时执行 stop slave + change master 将清空 relay log 。存在数据不一致的风险。 MySQL 插入生僻字/终端无法显示生僻字问题 基于 BLOB/TEXT 列上创建索引失败引起的思考 MySQL Resource Group - 使用资源组限制 SQL 使用的 CPU 数 更改账户身份验证插件注意事项 主从切换后导致 Event 停滞 and 主从故障 - Event 导致主从停滞的案例 INSERT 加什么锁 - 聊聊 INSERT 的加锁情况 MySQL 临时表空间 - 临时表空间(Temporary Tablespaces 及相关的变量 MySQL/PG 数据脱敏 - data_masking 插件和 postgresql_anonymizer 扩展初体验 MySQL/PG 对事务 DDL 的支持程度 - 从隐式提交聊到DDL事务 ONLINE DDL 收尾篇|如何有效实现 ONLINE - 关于 ONLINE DDL 的最佳实践 MySQL/PG 索引对于排序规则的依赖性 - 排序规则与索引的相关性问题,涉及到索引是否会失效 如何正确杀会话, KILL processlist_id/KILL QUERY? - 你知道如何正确杀掉活跃会话吗?
感谢阅读!关注我获取更多精彩内容。




