慢查询排查方式

191 阅读2分钟

高频的面试题,最近面试也着了道,所以整理了一下

慢查询

慢查询一般是指查询效率低下的查询SQL语句,不满足生产所需的要求,产生原因:

  • 根本原因查询数据量过大
  • 没有加索引,或者索引未生效
  • SQL语句不够优化

如何排查

1.服务监控

一般发现慢查询是通过服务监控查看到接口平均RT过大,达到秒级,如果服务接口没有跨服务调用或复杂逻辑,可以先排查SQL问题

2.慢查询日志

如果Mysql开启了慢查询日志,可优先去分析慢查询日志结果 MySQL的慢查询日志记录了在数据库中运行时间超过设定阈值(默认为10秒)的所有查询语句。通过分析这些慢查询可以发现性能低下或者需要进行优化的地方。以下是如何开启慢查询的配置

# 默认不启用,需手动开启
slow_query_log = 1
# 慢查询日志的存储位置
slow_query_log_file = /var/log/mysql/mysql-slow.log
# 没使用索引的查询
log_queries_not_using_indexes = 1
# 慢查询默认阈值 10秒 可根据实际业务需要调低成1~2秒
long_query_time = 10

explain执行计划

确定了是SQL慢查询的问题,那就去分析一下到底什么原因导致SQL执行缓慢 通常我们使用explain去分析执行计划,explain主要关注一下几个字段:

  • type:表示MySQL在表中找到所需行的方式,或者叫访问类型
    • type=ALL,全表扫描,MySQL遍历全表来找到匹配行
    • type=index,索引全扫描
    • type=range,索引范围扫描
    • type=eq_ref,唯一索引
    • type=NULL,MySQL不用访问表或者索引,直接就能够得到结果(性能最好)
  • possible_keys: 表示查询可能使用的索引
  • key: 实际使用的索引
  • key_len: 使用索引字段的长度
  • rows: 扫描行的数量
  • Extra
    • using index:覆盖索引,不回表
    • using where:回表查询
    • using filesort:需要额外的排序,不能通过索引得到排序结果

其他原因

如果排查到SQL索引命中,数据量也不大没什么优化空间,可以排查下是否是以下原因(一般是偶然情况出现):

  • 数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘
  • 执行的时候,遇到锁,如表锁、行锁
  • 项目并发较多,应用程序或数据库连接不够