数据库索引使用的注意事项以及索引失效的情况【Mysql】
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;