1.最左前缀法则
如果创建了联合索引,如果想在查询时使用到索引,那么需要遵守最左前缀法则。最左前缀法则值的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过某一列,索引将会部分失效(后面字段的索引失效)。
假设我们在一张student表中的字段age, name, address三个字段上建立了联合索引,其顺序为age, name, address,其创建索引的sql为:
create index idx_age_name_add on student(age,name,address);
最左前缀法则:在查询时,最左边的列,也就是age必须存在,否则索引全部失效。而且中间不能跳过某一列,否则该列后面的字段索引失效。
在执行select查询sql时,我们可以使用explain关键字来验证最左前缀法则。
另外:最左前缀法则中只的最左边的列,是指在查询时,联合索引的最左边的字段(即是第一个字段)必须存在,与我们编写SQL时条件编写的先后顺序无关。也就是说下面两句sql是等价的。
select * from student where age=12 and name='张三' and address='天津';
select * from student where name='张三' and age=12 and address='天津';
2.范围查询
联合索引中,出现范围查询(>, <),范围查询右侧的列索引失效。
当范围查询使用>=, <= 时,索引不会失效。索引在业务允许的情况下,尽可能使用类似于 >=, <= 这类范围查询,避免使用>, <。
3.索引失效的情况
-
索引列运算会导致索引失效。
不要在索引列上进行运算操作,否则索引会失效。
-
字符串类型字段使用时,不加引号,索引将失效。
如果字符串不加单引号,对于查询结果,没有什么影响,但是数据库存在隐式类型转换,索引将失效。
-
模糊查询
如果仅仅是尾部的模糊匹配,索引不会失效。如果是头部的模糊匹配,索引失效。
# 索引失效 select * from student where name like '%三'; # 索引有效 select * from student where name like '张%'; -
or连接条件用
or分割开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及到的索引都不会被用到。只有当
or连接的条件,左右两侧字段都有索引时,索引才生效。 -
数据分布的影响
在进行查询时,数据库还会评估使用索引的效率与走全表扫描的效率,如果走全表扫描的效率更快,则放弃索引,做全表扫描。因为索引使用来索引少量数据的,如果通过索引查询返回的大批量数据,则还不如走全表扫描,此时索引就会失效。
比如以下查询语句,在
student的整张表没有null值,我们在name上创建了索引,那么以下语句也会使用索引,具体可以使用explain关键字验证。select * from student where name is not null;