要查看MySQL的性能统计信息并找出是什么连接或请求导致MySQL占用100%的CPU,您可以采取以下步骤:
1. 查看当前运行的查询:
登录到MySQL服务器,使用以下命令查看当前活跃的查询和它们的状态:
SHOW FULL PROCESSLIST;
这个命令会列出所有当前正在运行的进程,包括每个进程执行的SQL语句和运行时间。
2. 使用性能模式:
如果您的MySQL版本支持,可以打开性能模式(Performance Schema)来收集详细的性能数据。开启后,您可以查询性能模式的各种表来分析性能问题。
3. 查看慢查询日志:
如果您之前已经开启了慢查询日志,可以通过查看慢查询日志来找出运行缓慢的查询。慢查询日志中会记录执行时间超过指定阈值的查询。您可以通过以下命令来查看慢查询日志的配置:
会话变量
SHOW VARIABLES LIKE '%slow_query_log%';
全局变量
SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
如果慢查询日志已开启,您可以找到日志文件并检查里面的内容。
如果慢日志为关闭则会输出
MariaDB [(none)]> SHOW VARIABLES LIKE '%slow_query_log%';
+---------------------+-----------------------+
| Variable_name | Value |
+---------------------+-----------------------+
| slow_query_log | OFF |
| slow_query_log_file | b209f58a1af5-slow.log |
+---------------------+-----------------------+
2 rows in set (0.001 sec)
开启慢查询日志:
您可以通过以下命令临时开启慢查询日志(只在当前会话有效):
SET GLOBAL slow_query_log = 'ON';
如果您想永久开启慢查询日志,需要在MySQL的配置文件(通常是my.cnf
或my.ini
)中设置:
[mysqld]
slow_query_log = 1
slow_query_log_file = /path/to/your/log-file-name-slow.log
long_query_time = 2
其中long_query_time
是慢查询的阈值,单位是秒,您可以根据需要设置。这里设置为2表示记录所有执行时间超过2秒的查询。
重启MySQL服务:
如果您修改了配置文件,需要重启MySQL服务来使更改生效。在Docker容器中,您可以使用以下命令重启MySQL服务:
docker restart <container_name_or_id>
请将<container_name_or_id>
替换为您的容器名称或ID。
监控慢查询日志:
开启慢查询日志后,您可以使用以下命令查看慢查询日志中的内容:
docker exec -it <container_name_or_id> tail -f /path/to/your/log-file-name-slow.log
或者,如果您有宿主机上的文件访问权限,您可以直接在宿主机上使用tail
命令来跟踪日志文件。
手动触发慢查询,谨慎使用,会异常占用
SELECT BENCHMARK(1000000000, ENCODE('message', 'password'));
分析慢查询日志:
一旦慢查询日志中有了数据,您可以分析这些查询,找出哪些查询执行时间长,是否有可以优化的地方。优化可能包括添加或修改索引、改写查询语句、调整数据库配置参数或者优化表结构。
开启慢查询日志可能会略微增加系统负载,因为它需要记录额外的数据。在问题解决后,您可以根据实际情况决定是否关闭慢查询日志。
4. 使用EXPLAIN
分析查询执行计划:
对于发现的慢查询,您可以使用EXPLAIN
或EXPLAIN ANALYZE
(MySQL 8.0.18及以上版本)命令来查看查询的执行计划,这有助于您了解MySQL是如何执行这些查询的,以及是否可以通过索引优化等方式来提升性能。
5. 检查InnoDB引擎状态:
您可以使用以下命令来获取InnoDB存储引擎的详细状态信息:
SHOW ENGINE INNODB STATUS;
这个命令会输出当前InnoDB存储引擎的状态,包括锁等待、I/O信息和缓冲池状态等。
6. 使用第三方工具:
您还可以使用第三方的性能分析工具,如Percona Toolkit
中的pt-query-digest
来分析慢查询日志,或者使用MySQL Workbench
等图形界面工具来辅助分析。