如何做慢查询优化?
这个问题可以说是一个高频问题,总是被问到,今天来总结下这个问题。
慢查询,就是 SQL 查询中耗时比较大的一类查询,MySQL 提供了慢查询日志 slow_query_log,
它会记录耗时大于我们设置的阈值的查询语句
set global slow_query_log = 1
如果我们想调优,把未走索引的查询也记录:
log_queries_not_using_indexes
1、慢查询日志的内容
2、为什么会出现慢查询,或者说慢查询的原因
- 等待时间长:锁的使用粒度过大、或者说出现死锁等,导致Lock_time 过长
- 执行时间长:索引失效、没有覆盖索引、关联查询太多 join、服务器调优及各个参数的设置
3、慢查询的优化思路
如何合理设计并利用索引
首先要考虑的是,不适合创建索引的列,就不要创建索引了,比如区分度不大的列、频繁更新的列、没有被 order by、group by、where 子句用到的。
其次是要考虑索引失效的情况:
- 联合索引没有符合最左匹配原则
- 对索引使用左或左右模糊查询
- 对索引使用函数
- 对索引进行表达式计算
- or条件后面的列没有用索引
对索引使用函数 - 对索引进行表达式计算
- or条件后面的列没有用索引
- 索引的类型转换导致索引失效