以下情况会导致数据库索引失效:
1. **使用函数或表达式**
在查询条件中对索引列使用函数或计算,如`WHERE YEAR(create_time) = 2023`(索引列`create_time`失效)。
*举例*:`SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%Y-%m') = '2023-10'`。
*腾讯云建议*:使用腾讯云数据库MySQL的**原生日期查询**(如`WHERE order_date BETWEEN '2023-10-01' AND '2023-10-31'`)以触发索引。
2. **隐式类型转换**
查询条件与索引列类型不匹配,如索引列是字符串`VARCHAR`,但用数字查询`WHERE phone = 13800138000`(`phone`列失效)。
*举例*:`SELECT * FROM users WHERE mobile = 12345678901`(`mobile`为`VARCHAR`类型)。
*腾讯云建议*:确保查询值与字段类型一致,或使用腾讯云数据库的**参数化查询**功能。
3. **使用`LIKE`以通配符开头**
`LIKE '%keyword'`会导致索引失效,但`LIKE 'keyword%'`可生效。
*举例*:`SELECT * FROM articles WHERE title LIKE '%数据库%'`。
*腾讯云建议*:改用**全文索引**(如腾讯云数据库MySQL的`FULLTEXT`索引)或搜索引擎(如腾讯云**Elasticsearch Service**)。
4. **违反最左前缀原则**
复合索引未从左列开始查询,如索引`(a, b, c)`,但查询条件只有`WHERE b=1 AND c=2`。
*举例*:`SELECT * FROM orders WHERE status=1 AND amount>100`(索引为`(user_id, status, amount)`)。
*腾讯云建议*:设计复合索引时遵循**查询顺序**,或使用腾讯云数据库的**索引推荐工具**优化。
5. **使用`OR`条件且未全索引覆盖**
`OR`连接的列中有一个无索引,如`WHERE a=1 OR b=2`(仅`a`有索引则`b`导致失效)。
*举例*:`SELECT * FROM products WHERE category_id=5 OR price<100`(仅`category_id`有索引)。
*腾讯云建议*:拆分为多个查询并用**UNION ALL**合并,或对高频条件建索引。
6. **数据分布倾斜或索引选择性低**
索引列值重复率高(如性别字段),优化器可能放弃索引。
*举例*:`SELECT * FROM users WHERE gender='男'`(`gender`只有两种值)。
*腾讯云建议*:对低选择性列改用**覆盖索引**或缓存热点数据(如腾讯云**Redis**)。
7. **查询使用`NOT IN`、`!=`或`<>`**
这些操作通常无法利用索引。
*举例*:`SELECT * FROM employees WHERE dept_id NOT IN (1,2,3)`。
*腾讯云建议*:改用`NOT EXISTS`或**反连接查询**优化。
8. **索引列参与计算**
如`WHERE id/2 = 10`(`id`索引失效)。
*举例*:`SELECT * FROM logs WHERE timestamp/3600 > 10`。
*腾讯云建议*:预先计算并存储结果字段,或使用**物化视图**(如腾讯云数据库TDSQL的**预计算功能**)。... 展开详请