SQL 执行效率的分析-show profile 分析慢查询

olei 1,215 views 0

show profile

有时候,需要确定 SQL 慢在哪个环节,此时 explain 不好确定。在 MySQL 数据库中,通过 profile,能够更清楚了解 SQL 执行过程中资源使用情况,能让我们知道到底慢在哪个环节

知识拓展:
可以通过设置参数 profiling = 1 来启用 SQL 分析。该参数可以在全局和 session 级别来设置。对于全局级别则作用于整个 MySQL 实例,而 session 级别仅影响当前 session。该参数开启后,后续执行 SQL 语句都将记录其资源开销,如 IO,上下文切换,CPU,Memory 等等。根据这些开销进一步分析当前 SQL 从而进行优化与调整。

如何使用 profile 分析慢查询,大致步骤为:确定整个 MySQL 版本是否支持 profile;确定 profile 是否关闭;开启 profile,执行 SQL;查看执行完 SQLquery id;通过 query id 查看 SQL 的每个状态及消耗时间。

  • 确定是否支持 profile
mysql> select @@have_profiling;

+------------------+
| @@have_profiling |
+------------------+
| YES              |
+------------------+

1 row in set, 1 warning (0.00 sec)

YES 表示支持 profile

  • 查看 profiling 是否关闭
mysql> select @@profiling;

+-------------+
| @@profiling |
+-------------+
|           0 |
+-------------+

1 row in set, 1 warning (0.00 sec)

0 表示关闭状态,默认是关闭的

  • 通过 set 开启 profile
mysql> set profiling=1;

Query OK, 0 rows affected, 1 warning (0.00 sec)

Tips:set 时没加 global,只对当前 session 有效

  • 执行 SQL 语句
mysql> select * from t1 where b=1000;
  • 确定 SQLquery id

    通过 show profile 语句确定执行过 SQLquery_id

mysql> show profiles;
+----------+------------+-------------------------------+
| Query_ID | Duration   | Query                         |
+----------+------------+-------------------------------+
|        1 | 0.00063825 | select * from t1 where b=1000 |
+----------+------------+-------------------------------+
1 row in set, 1 warning (0.00 sec)
  • 查询 SQL 执行情况

    通过 show profile for query 可看到执行过的 SQL 每个状态和消耗时间

mysql> show profile for query 1;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000115 |
| checking permissions | 0.000013 |
| Opening tables       | 0.000027 |
| init                 | 0.000035 |
| System lock          | 0.000017 |
| optimizing           | 0.000016 |
| statistics           | 0.000025 |
| preparing            | 0.000020 |
| executing            | 0.000006 |
| Sending data         | 0.000294 |
| end                  | 0.000009 |
| query end            | 0.000012 |
| closing tables       | 0.000011 |
| freeing items        | 0.000024 |
| cleaning up          | 0.000016 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

通过上面的结果,可以确定 SQL 执行过程具体在哪个过程耗时比较久,从而更高的进行 SQL 优化与调整

发表评论 取消回复
表情 图片 链接 代码

分享