MySQL一些常见的索引失效情况:
- 索引列使用函数或表达式
当对索引列使用函数或表达式时,MySQL 无法直接使用索引来查找数据,因为函数或表达式的结果是动态计算的,破坏了索引的有序性。
示例:
sql-- 假设age
列上有索引
SELECT * FROM users WHERE YEAR(birth_date) = 1990;
在这个查询中,YEAR(birth_date) 对索引列 birth_date 使用了函数,索引会失效。可以将查询改写为范围查询来使用索引:
sqlSELECT * FROM users WHERE birth_date BETWEEN ‘1990-01-01’ AND ‘1990-12-31’; - 隐式类型转换
当查询条件中的数据类型与索引列的数据类型不一致,并且发生隐式类型转换时,索引可能会失效。
示例:
sql-- 假设id
列是整数类型,并且有索引
SELECT * FROM users WHERE id = ‘123’;
这里将字符串 ‘123’ 与整数类型的 id 列进行比较,MySQL 会对 id 列进行隐式类型转换,导致索引失效。应使用正确的数据类型:
sqlSELECT * FROM users WHERE id = 123; - 模糊查询以通配符开头
在使用 LIKE 进行模糊查询时,如果通配符 % 位于字符串的开头,索引将无法有效使用。
示例:
sql-- 假设name
列上有索引
SELECT * FROM users WHERE name LIKE ‘%John’;
由于 % 在开头,My