什么情况下不走索引?

来自姬鸿昌的知识库
跳到导航 跳到搜索

1. 数据类型不一致

例如,在查询条件中,列的数据类型是整数,但查询值是字符串。例如,表中的 id 列是整数类型,而查询语句是 WHERE id = '1' ,而不是 WHERE id = 1 ,这种情况下可能不走索引。

2. 对索引列进行函数操作或表达式计算

比如,WHERE DATE(create_time) = '2024-07-15' ,而不是 WHERE create_time = '2024-07-15' ,对索引列 create_time 进行了函数 DATE() 操作,可能导致无法使用索引。

3. 模糊查询中以通配符开头

LIKE '%value' 这样以 % 开头的模糊查询,通常无法使用索引。但 LIKE 'value%' 这种以具体值开头的模糊查询可能会使用索引。

4. 索引列上存在大量重复值

如果索引列中的数据重复性很高,比如性别列只有 两种值,此时使用索引的效果可能不明显,MySQL 可能会选择全表扫描。

5. 表数据量小

当表中的数据量非常小时,MySQL 优化器可能会认为全表扫描比使用索引更快。

6. 条件中 OR 连接的多个条件中只有部分列有索引

例如,表中有 idname 列,分别有索引,但查询语句是 WHERE id = 1 OR name = 'John' ,可能不会使用索引。

7. 违反最左前缀原则

对于复合索引,如果查询条件没有遵循最左前缀原则,可能无法使用索引。例如,索引是 (col1, col2, col3) ,而查询条件是 WHERE col3 = 'value' ,就不会使用索引。

8. 隐式类型转换

当查询条件中的值与表中列的类型不匹配,导致隐式类型转换时,可能不会使用索引。