索引失效的场景有很多,曾经在一个up主那儿听说了一句总结的话,和大家一起分享一下这个口诀: 模型数空运最快
- 模 代表模糊查询,说明一下对于author这个索引字段,如下是成立的
-- 全表扫描
select * from article where author like '%李'
-- 走索引
select * from article where author like '李%'
- 型 数据类型发生转化,不走索引
-- id列上有索引,id为varchar,不会走索引
-- id是字符串时,数据库中的id都要转成数字,转成的值不确定(例如id='12ab'会被转成12,不可能从索引上找到12这个值的)
-- 所以得全表扫描
select * from article where id = 100
-- id列上有索引,id为int,会走索引
-- id是int时,'100'会被转成数字100,所以能走索引
select * from article where id = '100'
select "a" = 0; --1
select "123abc" = 123; --1
select " 123abc456" = 123; --1
- 数 对索引列进行函数运算不会走索引,不介绍,大家都懂
- 空 索引列有字段is null,索引会失效 只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL值,那么这一列对于此复合索引就是无效的。
因此,在数据库设计时,除非有一个很特别的原因使用 NULL 值,不然尽量不要让字段的默认值为 NULL。
- 运 索引列参与运算,会导致索引失效 是这样的
-- 全表扫描
select * from article where id + 1 = 5
- 最 最佳左前缀的原则,违反了这个原则,联合索引会失效的,这个规则我也经常用来考察新人,网上一大推,这篇文章主要是用来讲解一些容易出错的、不好掌握的点
- 快 使用全表扫描比使用索引更快 对于数据量不大,或者经常变化区分度不高的索引列,优化器会认为走全表扫描比索引块,这个时候索引也会失效