文章目录
- 索引失效及优化:
- 模糊查询失效:
- or连接失效:
- 违反最左前缀失效:
- 联合索引范围查询后的索引失效:
- 索引参与运算(包括函数)索引失效:
- 字符串不加单引号索引失效:
- 辨识度过低不走索引:
- 索引尽量使用覆盖查询:
- 查看索引使用情况:
- 导入文件优化:
- SQL语句优化:
- order by优化:
- FileSort优化:
- group by优化(针对老版本):
- 子查询优化:
- or优化:
- limit优化:
- 索引提示:
- 索引失效及优化总结
索引失效及优化:
以下提到的索引失效不是绝对的,严谨点来说应该是可能导致无法进行高效索引范围定位,或使优化器最终选择全表扫描。
模糊查询失效:
or连接失效:
上图OR 两边的列各自有索引,优化器使用 Index Merge 来合并两个索引的扫描结果。
违反最左前缀失效:
联合索引范围查询后的索引失效:
索引参与运算(包括函数)索引失效:
注意:MySQL 8.0.13+ 中,可以创建函数索引来专门优化这类查询
字符串不加单引号索引失效:
辨识度过低不走索引:
索引尽量使用覆盖查询:
查看索引使用情况:
导入文件优化:
SQL语句优化:
INSERT优化
原始方式
insertintotable_namevalues(a,b);insertintotable_namevalues(c,d);优化方式:
insertintotable_namevalues(a,b),(c,d);插入时手动开启事务并按顺序插入。
order by优化:
FileSort优化:
早期 MySQL 的 Filesort 主要有两种实现思路:
- 两次扫描算法:MySQL 4.1 之前主要采用这种方式。先读取排序字段和能够定位原数据行的信息进行排序,排序完成后再根据行位置读取查询所需的其他字段,因此可能需要两次访问数据,内存占用较小,但随机 I/O 较多。
- 一次扫描算法:MySQL 4.1 开始引入改进后的排序方式,将排序字段和查询所需的其他字段一次性读入 Sort Buffer,排序完成后可以直接返回结果,减少再次读取数据的开销,但会占用更多排序内存。
旧版本 MySQL 中,max_length_for_sort_data曾用于影响 Filesort 对这两种方式的选择,但从MySQL 8.0.20开始,该参数已经被废弃并且不再产生作用,因此在 MySQL 8 中不应再通过调大max_length_for_sort_data来优化排序。
在现代 MySQL 8 中,优化 Filesort 更应该优先考虑:
- 尽量利用索引完成
ORDER BY,避免额外排序; - 减少不必要的查询字段和需要参与排序的数据量;
- 根据实际排序情况合理设置
sort_buffer_size,而不是简单地全局调大
group by优化(针对老版本):
在MySQL 8.0之前,GROUP BY 默认会按分组字段排序,MySQL 8.0开始已经取消 GROUP BY 的隐式排序。同样也可以用索引来提高效率。
下图mysql5版本
下图mysql5版本
子查询优化:
or优化:
limit优化:
索引提示:
索引失效及优化总结
1.or有一侧非索引会失效,可用Union代替。
2.模糊查询%号前置不走索引,可以覆盖解决。
3.违反最左前缀失效
4.索引字段参与运算失效
5.字符不加单引号会失效
6.IN(not in)、is(is not)匹配辨识度低的值会失效,可以用强制索引解决。
7.一个以上的二级索引参与分组索引失效。