MySQL 中的索引失效情况
-
数据类型不匹配:
查询条件中的数据类型与索引列的数据类型不一致时,MySQL 可能无法利用索引。例如,索引列为整数类型,而查询条件使用字符串类型。 -
使用函数或表达式:
当查询条件中使用函数或表达式时,MySQL 可能会导致索引失效。例如:-
SELECT * FROM employees WHERE YEAR(hire_date) = 2023;
- 在此查询中,
YEAR(hire_date)
是一个函数调用,无法直接利用索引。
-
-
LIKE 查询中的前缀:
- 使用
LIKE
查询时,如果前面有通配符%
,则索引将失效。例如:SELECT * FROM employees WHERE name LIKE '%John';
- 使用
-
不满足最左匹配原则:
- 在组合索引中,如果查询条件没有按照索引定义的顺序进行匹配,将导致索引失效。例如:
sql
SELECT * FROM employees WHERE age = 30 AND salary = 5000;
- 如果索引是
(salary, age)
,则上述查询将无法利用索引。
- 在组合索引中,如果查询条件没有按照索引定义的顺序进行匹配,将导致索引失效。例如:
-
使用
OR
关键字:- 查询中如果使用了
OR
关键字,可能会导致索引失效。例如:sql
SELECT * FROM employees WHERE department_id = 10 OR name = 'John';
- 查询中如果使用了
-
使用
IN
关键字:- 对于
IN
操作符,如果其中的元素较多,MySQL 可能会选择不使用索引。例如:sql
SELECT * FROM employees WHERE department_id IN (1, 2, 3, ..., 100);
- 对于
-
不合理的索引设计:
- 索引的设计不合理也会导致索引失效,例如索引列的选择性低,或者组合索引中的字段顺序不当。
-
统计信息不准确:
- MySQL 在执行查询时会使用统计信息来决定是否使用索引。如果统计信息不准确,可能导致 MySQL 错误地判断索引的使用情况。
TiDB 中的索引失效情况
-
数据类型不匹配:
- 与 MySQL 类似,TiDB 中查询条件的数据类型与索引列的数据类型不一致时,索引可能失效。
-
使用函数或表达式:
- 在 TiDB 中,使用函数或表达式的查询条件同样会导致索引失效。例如:
SELECT * FROM employees WHERE DATE(hire_date) = '2023-01-01';
- 在 TiDB 中,使用函数或表达式的查询条件同样会导致索引失效。例如:
-
LIKE 查询中的前缀:
- TiDB 中也存在类似问题,使用
%
前缀的LIKE
查询会导致索引失效。
- TiDB 中也存在类似问题,使用
-
不满足最左匹配原则:
- TiDB 对组合索引的最左匹配原则也适用,查询条件未按索引顺序匹配会导致索引失效。
-
使用
OR
关键字:- TiDB 中的
OR
关键字也可能导致索引失效,尤其是当OR
的条件中混合了有索引和没有索引的列时。
- TiDB 中的
-
使用
IN
关键字:- TiDB 在处理大量
IN
条件时,可能会选择不使用索引,导致全表扫描。
- TiDB 在处理大量
-
不合理的索引设计:
- TiDB 索引设计不合理,如选择性低或字段顺序不当,也会导致索引失效。
-
统计信息不准确:
- TiDB 也依赖统计信息来优化查询,如果统计信息不准确,可能导致错误的索引选择。