MySQL索引优化
以下笔记来自于该视频:https://www.bilibili.com/video/BV1KW411u7vy?p=20&share_source=copy_web
注意组合索引时,索引顺序
索引优化
-
在联合索引中(a,b,c)中,在以下案例中会产生 Using filesort (文件内排序)
where a=1 and b>2 order by c
查询出a=1的之后,查询b>2的,但是c 是无序的,所以MySQL会进行一次文件内排序
image.png -
左连接时,索引加在右表比较合适 (右连接时,相反)【永远使用小结果集驱动大结果集】
索引加在右表的情况
image.png索引加在左表的情况
image.png原因:
左连接时,无论如何左表都需要表的全部数据
当索引加在左表上意义不大,但是查询对应的右表数据时就需要全表扫描,找出相对应的id。
当索引加在右表时,左表关联右表时,直接通过索引查出对应数据,避免了全表扫描。
- 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少 Select *
索引失效的情况
-
最佳左前缀法则
如果是一个复合索引,查询从索引的最左前列开始并且不跳过索引中的列。
-
不在索引列上左任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
示例一
image.png示例二,使用了 LEFT 导致索引失效
image.png
-
存储引擎不能使用索引范围条件右边的列
存在联合索引(a,b,c),用到了a ,到 b 的时候变成了范围查找,导致用不上 c 。
where a=1 and b>2 and c=3
-
is null,is not null 也无法使用索引
image.png -
like 以通配符开头(’%abc...‘)MySQL索引失效会变成全表扫描
image.png
-
少用 or,用它来连接时会索引失效
image.png
网友评论