1、全表扫描:
1、场景:
当查询条件没有使用索引,或者索引没有被正确使用时,数据库可能会进行全表扫描,导致索引失效。
2、避免方法:
(1)确保查询条件中的字段已经被索引。
(2)使用EXPLAIN命令分析查询计划,查看是否使用了索引。
(3)优化查询条件,使其能够利用索引。
2、索引列上的运算:
1、场景:
在索引列上进行运算(如加法、乘法等)会导致索引失效。
2、避免方法:
(1)尽量避免在索引列上进行运算。
(2)如果需要进行运算,可以考虑将运算结果存储为一个新的列,并对该列进行索引。
3、使用函数或表达式:
1、场景:
在WHERE子句中使用函数或表达式处理索引列,可能会导致索引失效。
2、避免方法:
(1)尽量避免在WHERE子句中使用函数或表达式处理索引列。
(2)如果必须使用函数或表达式,可以考虑将其结果存储为一个新的列,并对该列进行索引。
4、LIKE模糊查询:
1、场景:
以%开头的LIKE模糊查询可能会导致索引失效。
2、避免方法:
(1)尽量避免使用以%开头的LIKE模糊查询。
(2)如果必须使用,考虑将查询条件改写为其他形式,如使用全文搜索等。
5、OR条件:
1、场景:
在WHERE子句中使用OR连接多个条件时,如果OR连接的字段没有同时被索引,可能会导致索引失效。
2、避免方法:
(1)尽量避免在WHERE子句中使用OR连接多个条件。
(2)如果必须使用OR,确保OR连接的字段都已经被索引,并且考虑使用UNION ALL等替代方案。
6、数据类型不匹配:
1、场景:
当查询条件中的数据类型与索引列的数据类型不匹配时,可能会导致索引失效。
2、避免方法:
(1)确保查询条件中的数据类型与索引列的数据类型一致。
(2)如果数据类型不一致,考虑进行类型转换或使用CAST函数进行转换。
7、索引列的选择性低:
1、场景:
当索引列的选择性很低时(即该列的值大部分相同),索引可能不会被使用。
2、避免方法:
(1)选择具有高选择性的列作为索引列。
(2)考虑使用复合索引来提高查询性能。
8、其他注意事项:
(1)覆盖索引:尽量使用覆盖索引(即查询列都是索引列),以减少回表查询的次数。
(2)最左前缀法则:如果索引有多列,查询条件必须包含索引的最左列才能使用索引。
(3)范围查询:范围查询右边的列可能不会被使用到索引。