找出慢查询的两种方式
- 通过 --processlist 选项不断查看 show full processlist 的输出,记录查询第一次出现的时间和消失的时间。
- 通过 tcpdump 将网络数据包保存到数据盘,然后使用 pt-query-digest 的 --type=tcpdump 选项来解析并分析查询【这种方法比较精确,并且可以捕获所有查询】
优化 MySQL 的性能的一种方式就是优化慢查询,通过慢查询日志捕获服务器上的所有查询,通过工具 pt-query-digest (https://docs.percona.com/percona-toolkit/pt-query-digest.html) 进行 mysql 查询日志的分析,他可以将查询报告保存到数据库中,以及追踪工作负载随时间的变化。
show profile 命令
show profile 是 mysql 用于显示当前会话执行 sql 语句的性能信息的语句。这条语句可以分析和优化 sql 性能。
- 首先确定 Mysql 会话中开启 profiling。可以使用如下命令开启 profiling:
set profiling = 1;
- 然后执行你想要分析的语句,如:
SELECT * FROM your_table WHERE your_column = 'your_value';
- 执行完 SQL 语句后,可以使用以下命令查看 profile 列表:
SHOW PROFILES;
- 这个命令会列出当前会话中最近执行的所有查询的查询 ID 和查询内容。输出示例:
+----------+------------+-----------------------------+
| Query_ID | Duration | Query |
+----------+------------+-----------------------------+
| 1 | 0.00053600 | SELECT DATABASE() |
| 2 | 0.00041800 | SHOW TABLES |
| 3 | 0.00025200 | SELECT * FROM your_table |
+----------+------------+-----------------------------+
为了查看特定查询的详细性能信息,可以使用 SHOW PROFILE 命令并指定查询 ID。例如,查看查询 ID 为 3 的查询的详细信息:
SHOW PROFILE FOR QUERY 3;
输出示例:
+--------------------+----------+
| Status | Duration |
+--------------------+----------+
| starting | 0.000018 |
| checking permissions | 0.000005 |
| Opening tables | 0.000015 |
| init | 0.000020 |
| System lock | 0.000005 |
| optimizing | 0.000009 |
| statistics | 0.000019 |
| preparing | 0.000015 |
| executing | 0.000003 |
| Sending data | 0.000088 |
| end | 0.000004 |
| query end | 0.000005 |
| closing tables | 0.000007 |
| freeing items | 0.000019 |
| cleaning up | 0.000004 |
+--------------------+----------+
每一行表示查询执行过程中所经历的一个阶段及其所花费的时间。
使用 SHOW PROFILE 的场景
- 查询性能优化:通过分析各个阶段的耗时,找出影响查询性能的瓶颈,进而进行优化。
- 诊断性能问题:当查询执行时间过长时,可以使用 SHOW PROFILE 诊断具体哪个阶段耗时较多,找出问题所在。
- 监控和调试:在开发和调试过程中,监控 SQL 查询的性能,确保查询在合理的时间内完成。
注意事项
● SHOW PROFILE 只能分析当前会话中的查询,不能分析其他会话中的查询。
● SHOW PROFILE 提供的性能信息是针对单次查询的,不适用于长时间运行的复杂查询或批量查询分析。
● 在生产环境中开启 profiling 可能会对性能有一定影响,建议在开发或测试环境中使用。
show status 命令
show status 命令在 mysql 中用于显示关于服务器关于服务器状态的各种全局或会话级别的统计信息和变量。 通过这些状态变量,可以了解数据库服务器的当前性能和运行状态,帮助进行性能调优和故障排查。
基本用法:
show status
此命令会返回当前会话的所有状态变量及其值:
状态变量分类
MySQL 的状态变量涵盖多个方面,以下是一些常见的状态变量及其含义:
● 连接状态
○ Connections:自服务器启动以来的连接请求数。
○ Threads_connected:当前打开的连接数。
● 查询处理
○ Queries:自服务器启动以来执行的 SQL 语句总数。
○ Slow_queries:执行时间超过 long_query_time 秒的查询数。
● 网络流量
○ Bytes_received:自服务器启动以来接收的字节数。
○ Bytes_sent:自服务器启动以来发送的字节数。
● 缓存和缓冲
○ Key_reads:从缓存中未找到而从磁盘读取的键读操作数。
○ Key_writes:写入到磁盘上的键写操作数。
● 表处理
○ Opened_tables:自服务器启动以来打开的表的数目。
○ Open_tables:当前打开的表的数目。
使用场景
● 性能调优:通过监控状态变量,识别性能瓶颈,例如发现慢查询、缓存命中率低、连接数过多等问题。
● 资源监控:监控资源使用情况,例如网络流量、内存使用、磁盘 I/O 等。
● 故障排查:诊断数据库故障,找到问题根源。例如,通过查看连接状态,判断是否存在连接泄漏问题。
● 审计和统计:了解数据库的运行情况和负载水平,生成运行报告。
以下是一些常见的使用示例:
查看服务器启动时间 sql
SHOW STATUS LIKE 'Uptime';
查看当前打开的连接数
SHOW STATUS LIKE 'Threads_connected';
查看自启动以来的查询总数
SHOW GLOBAL STATUS LIKE 'Queries';
查看慢查询数
SHOW GLOBAL STATUS LIKE 'Slow_queries';