文章目录
- 全值匹配
- 最左前缀原则
- 不在索引列上使用函数,会导致索引失效而转向使用全表扫描
- 范围条件右边的索引列会失效
- 尽量使用覆盖索引
- 使用不等于操作符无法使用索引
- is null,is not null 一般情况下也无法使用索引
- like 以通配符开头的,索引会失效
- 少用 or 或 in,MySQL 不一定使用索引
- 查询范围过大,可能不会使用索引
全值匹配
例如,字段 film_id、actor_id 组成联合索引 idx_film_actor_id,那么在查询条件中使用到联合索引的全部字段,则表示全值匹配。
最左前缀原则
使用复合索引的前面字段,但是不能跳过使用后面的字段
不在索引列上使用函数,会导致索引失效而转向使用全表扫描
范围条件右边的索引列会失效
尽量使用覆盖索引
使用不等于操作符无法使用索引
is null,is not null 一般情况下也无法使用索引
like 以通配符开头的,索引会失效
mysql> select * from user where name like 'hello%'; -- 会使用索引,索引值的前面5个字符在索引树中是有序的
mysql> select * from user where name like '%hello'; -- 不会使用索引,索引值的后面的若干个字符在索引树中是无序的,所以无法使用索引
解决 like ‘%字符串%’ 索引不被使用的方法:
少用 or 或 in,MySQL 不一定使用索引
如果 in (…) 里面的字段不要太多也许会使用索引,or 也是一样;如果指定过多的字段,那么 MySQL 就会扫描索引树多次,所以可能会放弃使用索引
查询范围过大,可能不会使用索引
select * from user where age >= 1 and age <= 2000;
以上查询可能就不会走索引,而是全表扫描,因为年龄范围过大,优化器评估到查询条件已经完全包含全表数据了,所以干脆就直接全表扫描了。建议拆分成几个小范围查询。