慢 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 现象,说明没有正确的使用索引从而导致执行缓慢。此时可以修正索引问题后重新执行。