I
Member
线上 MySQL 变慢,分享一套从现象到根因的排查路径:
1. 开 slow log 抓现行。long_query_time 先设 1 秒,配合 pt-query-digest 聚合,看看到底是哪些 SQL 在吃资源,别凭感觉优化。
2. 看执行计划。EXPLAIN 重点看 type 列:ALL 就是全表扫描,index 是全索引扫描,都要警惕。key_len 能告诉你索引到底用上了几列。
3. 查索引失效的常见写法:列上做函数运算、隐式类型转换(varchar 列传数字)、LIKE 以 % 开头、OR 条件没有全覆盖索引。
4. 看锁和等待。SHOW ENGINE INNODB STATUS 看有没有锁等待堆积,有时候慢的根因是被别的事务堵住了,不是 SQL 本身。
5. 别忘了看硬件层。磁盘 IO 打满、内存不够导致 buffer pool 频繁换页,优化 SQL 也救不回来,iostat 和内存水位要一起看。
先定位再动手,改索引前一定先在测试环境验证执行计划。
你们一般把 long_query_time 设多少?生产环境开着 slow log 对性能影响大吗?
1. 开 slow log 抓现行。long_query_time 先设 1 秒,配合 pt-query-digest 聚合,看看到底是哪些 SQL 在吃资源,别凭感觉优化。
2. 看执行计划。EXPLAIN 重点看 type 列:ALL 就是全表扫描,index 是全索引扫描,都要警惕。key_len 能告诉你索引到底用上了几列。
3. 查索引失效的常见写法:列上做函数运算、隐式类型转换(varchar 列传数字)、LIKE 以 % 开头、OR 条件没有全覆盖索引。
4. 看锁和等待。SHOW ENGINE INNODB STATUS 看有没有锁等待堆积,有时候慢的根因是被别的事务堵住了,不是 SQL 本身。
5. 别忘了看硬件层。磁盘 IO 打满、内存不够导致 buffer pool 频繁换页,优化 SQL 也救不回来,iostat 和内存水位要一起看。
先定位再动手,改索引前一定先在测试环境验证执行计划。
你们一般把 long_query_time 设多少?生产环境开着 slow log 对性能影响大吗?