索引失效的情况有哪些,真失效的

索引失效的情况有哪些,真失效的
最新回答
清旖

2026-10-24 11:30:39

索引失效的常见情况主要包括以下几种:

  1. 联合索引不满足最左前缀原则联合索引基于B+树结构,查询需从最左列开始使用索引。例如,联合索引为(a, b, c)时,若查询条件为where b = 10,因未使用最左列a,索引无法定位数据;而where a = 10 and b = 20可生效。若跳过中间列(如where a = 10 and c = 30),则c的索引也会失效。

  2. SQL语句中出现函数或运算对索引列使用函数、运算或类型转换会改变原始值,导致索引失效。例如:

    函数操作:where date(create_time) = '2023-01-01'(对列应用date()函数);

    隐式转换:where int_column = '123'(字符串与整数类型不匹配);

    显式转换:where cast(varchar_column as int) = 123(强制类型转换)。

  3. 范围查询字段后的索引失效复合索引中,范围查询(如>、<、BETWEEN、LIKE)会导致后续字段索引失效。例如,索引为(a, b, c)时,查询where a > 10 and b = 5 and c = 3中,b和c的索引无法被利用,因范围查询a > 10已破坏索引的连续性。

  4. OR条件两侧字段存在无索引列若OR连接的字段中任一字段无索引,则整体索引失效。例如,where col1 = 10 or col2 = 20中,若col2无索引,优化器会放弃使用col1的索引,转而全表扫描。

  5. 使用LIKE左模糊查询B+树索引按字符串完整内容排序,左模糊查询(如where name like '%abc')因%在开头,无法利用索引的前缀排序特性;而右模糊查询(如where name like 'abc%')可生效。

  6. 数据量过小当表数据量极小(如500-1000行)时,优化器可能认为全表扫描比索引查询更高效,从而主动放弃使用索引。

  7. 使用否定条件否定条件(如<>、NOT IN、NOT LIKE)会导致满足条件的数据分散,索引效率降低。例如,where col <> 5时,优化器可能选择全表扫描而非索引。

  8. 查询NULL/NOT NULL时,优先使用占比小的索引优化器会根据数据分布选择索引。例如,若某列NULL值较少,查询where col is null会使用索引;反之,若NULL值占比高,则可能失效。

  9. GROUP BY无WHERE限制且数据量大无过滤条件的GROUP BY操作(如select col1, count(*) from table group by col1)在数据量大时,优化器可能认为全表扫描更高效,导致索引失效。

  10. 非覆盖索引若索引未覆盖查询所需字段,需回表查询原始数据,增加开销。例如,索引仅含name,但查询需email时,可能因回表成本高而失效。

  11. 数据类型不一致查询值与字段类型不匹配时,数据库会进行隐式转换,导致索引失效。例如,整数列id用字符串查询(where id = '123')时,因类型不匹配而失效。