视图使用like失效_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 导致的索引失效
执行前:
执行后:
定义 可以导致索引失效的情况有 6 种: 复合索引,跨列。 复合索引,没有全索引匹配。 复合索引,使用 5 种不等于: != <> is null is not null in 在索引上进行函数运算,类型转换。 like 关键字,使用 % 开头 使用 or 关键字 主要危害 索引失效,查询效率低下。 改进方法 SQL 优化是一种概率层面的优化,不会一定有效。使用索引覆盖会肯定有效。 代码实例 实例 1: 目的:演示在复合索引上运算导致索引失效 执行前: 取其中两个顺序索引执行,索引正常利用。 失效运算执行后: 通过 key_len 的长度推断,复合索引只用了其中一个,因此另外一个在运算过程中失效。 索引都执行了运算,全部失效。 复合索引,左边失效,右边全部失效。 实例 2: 目的:演示在单索引上运算导致索引失效 全部失效执行: 左边失效执行后: 剩余单索引依然有效,不受影响。 实例 3: 目的:演示使用几种不等于会导致索引失效 执行前: 增加不等号执行后: 实例 4 目的: 演示 SQL 优化器按概率影响主动优化的情况 执行前: > 执行后: 实例 4 目的: like 以 % 开头,导致索引失效 执行前: 去掉 % 开头执行后: 必须使用 % 开头的改进办法:索引覆盖 实例 5 目的:演示类型转换导致索引失效 执行前: 隐式执行后: 实例 6 目的:演示使用关键字 or 导致的索引失效 执行前: 执行后: