慢 SQL 的一般排查步骤为:

1.定位慢 SQL;

2.定位性能损耗节点;

3.定位性能损耗原因并处理。

说明:排查过程中,建议通过 MySQL 命令行进行连接:mysql -hIP -PPORT -uUSER -pPASSWORD -c 。请务必加上 “-c”,防止 MySQL 客户端过滤掉注释(默认)从而影响 HINT 的执行。

定位慢 SQL

定位慢 SQL 一般有两种场景:历史信息可从慢 SQL 记录中查询;实时慢 SQL 执行信息可使用SHOW PROCESSLIST 指令展示。

查看慢 SQL 记录

执行以下指令查询慢 SQL Top 10: mysql> SHOW SLOW limit 10;

查看当前实时 SQL 执行信息: mysql>SHOW PROCESSLIST WHERE COMMAND != ‘Sleep’;

0004.png

定位性能损耗节点

从慢 SQL 记录或者实时 SQL 执行信息中定位到慢 SQL 后,可以执行 TRACE 指令跟踪该 SQL 的运行时间,以便定位瓶颈。TRACE 命令会实际执行 SQL,在执行过程中记录所有节点消耗的时间,并返回执行结果。

针对定位的慢 SQL,可以执行以下指令: mysql> trace select detail_url, sum(distinct price) from t_item group by detail_url;

TRACE 指令执行完毕后,可以执行 SHOW TRACE 命令查看结果,根据每个组件的时间消耗来判断慢 SQL 的瓶颈: mysql> SHOW TRACE;

SHOW TRACE 返回的结果中,根据 TIME_COST (单位毫秒)列可以判断哪个节点上的执行时间消耗大。同时可以看到对应的 GROUP_NAME (即 DRDS/RDS 节点),以及 STATEMENT 列信息(即正在执行的 SQL)。

将组装好的 HINT 及带 EXPLAIN 前缀的 STATEMENT 拼装成新的 SQL 并执行。EXPLAIN 指令不会真正执行,而只是显示该 SQL 的执行计划信息。出现了 Using temporary; Using filesort 现象,说明没有正确的使用索引从而导致执行缓慢。此时可以修正索引问题后重新执行。