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
常见的原因有以下这些
- 没有加索引,导致全盘扫描
- 用错索引,例如没有遵循最左匹配前缀,或者是索引区分度不高
- 查询字段太多
- 回表次数多
- 表关联超过3张表
- 深度分页问题
3.怎么定位问题
通过explain查看SQL的执行计划,判断做走了哪些索引
3-1.执行计划简介
执行计划包括下面几个常见字段
- type:表示查询时所使用的索引类型,包括All,index,range,ref,eq_ref,const等
- possible_keys:表示查询油画城选择使用的索引
- key:表示查询优化器选择使用的索引
- 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在执行操作时所做的一些附加操作
4.怎么解决问题
却索引加索引,join太多就拆分表