慢 SQL 的问题如何排查?

发现问题

  1. 如果使用了一些数据库的中间件,会有慢 SQL 日志,如 TDDL

  2. 不用中间件也可以配置慢 SQL 日志

    1. 找到 MySQL 的配置文件 my.cnf (或 my.ini ),通常位于 MySQL 的安装目录下的 conf 或者 etc 文件夹

    2. 在配置文件中启用慢查询日志:找到或添加以下配置项:

       slow_query_log = 1
       slow_query_log_file = /path/to/slow-query.log
       long_query_time = 1 
      
    3. 重启 MySQL 服务:保存配置文件并重新启动 MySQL 服务,使配置生效

    4. 查看慢查询日志:使用文本编辑器打开慢查询日志文件,路劲为在配置问价中指定的路径。例如,在 Linux 上可以使用以下命令:

      vim /path/to/slow-query.log

定位问题

通过上面的各种监控、报警以及日志之中,我们就可以找到对应的慢 SQL 的具体 SQL 了,然后就可以进一步分析为什么这个 SQL 是慢 SQL 。

一般来说,导致一个 SQL 很慢的常见原因有以下几个:

  1. 没有索引
  2. 用错索引(没有遵循最左前缀匹配原则、索引区分度不高)
  3. 查询字段太多
  4. 回表次数多
  5. 多表 join
  6. 深度分页
  7. 其他

解决问题

最难的不是解决问题,而是定位问题,因为一旦一个问题被定位到了,解决起来都比较容易。缺索引就加索引, join 太多就拆分就好了。