SQL高级:SQL 的常见问题-索引失效


定义

可以导致索引失效的情况有 6 种:

  • 复合索引,跨列。
  • 复合索引,没有全索引匹配。
  • 复合索引,使用 5 种不等于:
    • !=
    • <>
    • is null
    • is not null
    • in
  • 在索引上进行函数运算,类型转换。
  • like 关键字,使用 % 开头
  • 使用 or 关键字

主要危害

索引失效,查询效率低下。

改进方法

SQL 优化是一种概率层面的优化,不会一定有效。使用索引覆盖会肯定有效。

代码实例

实例 1:

目的:演示在复合索引上运算导致索引失效

执行前:


取其中两个顺序索引执行,索引正常利用。


失效运算执行后:

通过 key_len 的长度推断,复合索引只用了其中一个,因此另外一个在运算过程中失效。

索引都执行了运算,全部失效。

复合索引,左边失效,右边全部失效。

实例 2:

目的:演示在单索引上运算导致索引失效

全部失效执行:

左边失效执行后:

剩余单索引依然有效,不受影响。

实例 3:

目的:演示使用几种不等于会导致索引失效

执行前:

增加不等号执行后:

实例 4

目的: 演示 SQL 优化器按概率影响主动优化的情况

执行前:

> 执行后:

实例 4

目的: like 以 % 开头,导致索引失效

执行前:


去掉 % 开头执行后:


必须使用 % 开头的改进办法:索引覆盖


实例 5

目的:演示类型转换导致索引失效

执行前:


隐式执行后:


实例 6

目的:演示使用关键字 or 导致的索引失效

执行前:


执行后:


举报
评论 0