无法命中索引的几种情况
正确使用索引
数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。
1. like '%xx'
select * from tb1 where name like='%cn';
2. 使用函数
select * from tb1 where reverse(name) = 'giao';
3. or
select * from tb1 where nid = 1 or email = 'seven@live.com';
--特别的:当or条件中有未建立索引的列才失效
--以下会走索引
select * from tb1 where nid = 1 or name = 'seven'; --nid和name都是索引
select * from tb1 where nid = 1 or email = 'seven@live.com' and name= 'alex'
--nid和name是索引,email不是,也会走索引
4. 类型不一致
如果列是字符串类型,传入的条件是必须是字符串,不然无法命中索引
select * from tb1 where name = 999; --这里传的条件是整型,无法命中索引
5. !=
select * from tb1 where name != 'alex'
--特别的:如果是主键,则还是会走索引
select * from tb1 where nid != 123
6. >
select * from tb1 where name > 'alex'
--特别的:如果是主键或索引是整数类型,则还是会走索引
select * from tb1 where nid > 123
select * from tb1 where num > 123
7.order by
select email from tb1 order by name desc ;
--当根据索引排序时候,选择的映射如果不是索引,则不走索引
--特别的:如果对主键排序,则还是走索引:select * from tb1 order by nid desc;
8.组合索引最左前缀
如果组合索引为:(name,email)
name and email -- 使用索引
name` -- 使用索引
条件只有email -- 不使用索引