数据库索引使用的注意事项以及索引失效的情况【Mysql】

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

  1. 索引列运算会导致索引失效。
    不要在索引列上进行运算操作,否则索引会失效。
  2. 字符串类型字段使用时,不加引号,索引将失效。
    如果字符串不加单引号,对于查询结果,没有什么影响,但是数据库存在隐式类型转换,索引将失效。
  3. 模糊查询
    如果仅仅是尾部的模糊匹配,索引不会失效。如果是头部的模糊匹配,索引失效。
    # 索引失效
    select * from student where name like '%三';
    # 索引有效
    select * from student where name like '张%';
    
  4. or连接条件
    or分割开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及到的索引都不会被用到。
    只有当or连接的条件,左右两侧字段都有索引时,索引才生效。
  5. 数据分布的影响
    在进行查询时,数据库还会评估使用索引的效率与走全表扫描的效率,如果走全表扫描的效率更快,则放弃索引,做全表扫描。因为索引使用来索引少量数据的,如果通过索引查询返回的大批量数据,则还不如走全表扫描,此时索引就会失效。
    比如以下查询语句,在student的整张表没有null值,我们在name上创建了索引,那么以下语句也会使用索引,具体可以使用explain关键字验证。
    select * from student where name is not null;
    

猜你喜欢

转载自blog.csdn.net/qq_36944952/article/details/125718013