慢SQL问题如何排查

1.什么是慢SQL

慢查询是指数据库查询时间超过指定时间的SQL语句

2.如何定位慢SQL

通常我们可以借助一些中间件,比如说Durid慢sql监控,MySQL自带慢SQL日志

2-1.配置慢SQL日志

  • 找到MySQL的配置文件my.cnf(my.cni),通常位于MySQL安装目录下的etc或者conf文件夹
  • 启用慢查询日志,将其添加到配置文件中

slow_query_log = 1

slow_query_log_file = /path/to/slow-query.log

long_query_time = 1

  • 重启MySQL服务,使配置文件生效

可以通过查询慢查询日志文件,查询有哪些慢SQL

vim /path/to/slow-query_log

2-2.常见原因

在我们找到具体的sql之后,我们需要进一步分析为什么这个SQL会是慢SQL

常见的原因有以下这些

  1. 没有加索引,导致全盘扫描
  2. 用错索引,例如没有遵循最左匹配前缀,或者是索引区分度不高
  3. 查询字段太多
  4. 回表次数多
  5. 表关联超过3张表
  6. 深度分页问题

3.怎么定位问题

通过explain查看SQL的执行计划,判断做走了哪些索引

3-1.执行计划简介

执行计划包括下面几个常见字段

  1. type:表示查询时所使用的索引类型,包括All,index,range,ref,eq_ref,const等
  2. possible_keys:表示查询油画城选择使用的索引
  3. key:表示查询优化器选择使用的索引
  4. Extra:表示额外信息,包括Using index,Using filesort,Using temporary

UNIQUE KEY 'd'

KEY 'idx_abc' ('a','b','c')

唯一索引为d,组合索引a,b,c

type:

All:表示没有走索引,执行的是全盘扫描 where e = 'hello'

index:表示全索引扫描,通常出现在组合索引中,where b = 'hello',因为没有遵循最左匹配原则

range:范围查询:只会扫描索引树的一个范围来查找匹配的行,where a > 1 and c < 5

ref:非唯一索引扫描,where a = 'hello',通常是普通索引

eq_ref:唯一索引扫描,当在连接操作中使用了唯一索引或者主键索引,并且连接条件是基于这些索引的等值条件时,MySQL通常会选择eq_ref类型

const:使用常数索引,where d = 'hello',常出现在唯一索引中

possible_keys和key:

possible_keys表示查询语句中可以使用的索引,而不是实际使用的索引

key表示实际使用的索引

extra表示MySQL在执行操作时所做的一些附加操作

MySQL高级——Explain信息中Extra字段解释_mysql explain extra-CSDN博客

4.怎么解决问题

却索引加索引,join太多就拆分表

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值