说一下索引失效的场景

使⽤左或者左右模糊匹配:⽐如 LIKE '%abc' 这样的查询会导致索引失效。

在索引列上使⽤函数或表达式: 索引列上参与计算,索引失效

在 WHERE ⼦句中,如果在 OR 前的条件列是索引列,⽽在 OR 后的条件列不是索引列,那么索引会失效。

SELECT * FROM table WHERE UPPER(column) = 'VALUE';

违背最左匹配原则,索引失效

数据分布不均匀: 如果数据分布不均匀,例如某个索引列的⼤多数值都相同,选择性降低,导致索引失效。

隐式类型转换: 如果查询中的条件涉及到隐式类型转换,例如将字符串与数字⽐较,索引可能⽆法被使⽤。

数据库索引失效的常见场景和原因主要包括以下几点: 1. **查询条件中没有包含联合索引最左边的字段**,此时无法利用联合索引进行高效查找。因为联合索引依赖于最左前缀原则,只有在查询条件中使用了索引的最左列,或者连续的多个左列时,才能有效利用索引[^2]。 2. **使用`SELECT *`查询所有列的数据**,如果表中存在非索引列,则会导致无法走覆盖索引,从而降低查询效率。当查询列全部为索引列时,可以利用覆盖索引提高性能;否则,需要回表查询,影响效率[^2]。 3. **对索引列进行计算或函数操作**,例如`WHERE id + 1 = 10`或`WHERE DATE(create_time) = '2023-01-01'`,这会使得数据库无法直接使用索引,必须扫描整个表来获取结果[^2]。 4. **字段类型不匹配**,例如定义为`VARCHAR`类型的字段传入了整型数据,可能导致索引失效。MySQL尝试将字符串转换为数字时可能会有歧义,因此不会使用索引。而整型字段传入字符串则通常不会导致索引失效。 5. **使用`LIKE`通配符开头**,如`WHERE name LIKE '%abc'`,由于无法确定搜索的起点,索引无法被有效利用。 6. **列之间的比较操作**,比如`WHERE a = b`,即使`a`和`b`都有各自的索引,也无法通过索引来加速这种跨列的比较操作。 7. **使用`OR`关键字且部分条件索引支持**,若`OR`连接的两个条件中有一个未创建索引,则整个查询可能都无法利用索引。此外,当`OR`两边是范围查询(如`>`、`<`)时,也可能导致索引失效[^3]。 8. **`ORDER BY`语句不符合最左前缀原则**,或者排序字段不是来自同一个索引,又或者是混合使用升序和降序排列,这些情况都会使索引失效。为了确保`ORDER BY`能有效利用索引,应保证其遵循最左匹配原则,并保持一致的排序方向[^2]。 9. **`NOT IN`与`NOT EXISTS`**,这两个操作都不支持走索引,相比之下,`IN`和`EXISTS`可以在适当的情况下利用索引提升性能。对于性能不佳的`IN`操作,可以用`EXISTS`替代以优化SQL语句[^2]。 10. **没有使用`WHERE`或`LIMIT`关键字的`ORDER BY`**,在这种情况下,即使有合适的索引存在,也不会被用于排序操作[^2]。 了解并避免上述索引失效的情况有助于编写更高效的SQL查询,提升数据库的整体性能。 ```sql -- 示例:正确使用覆盖索引 SELECT user_id, status FROM orders WHERE user_id = 12345 AND status = 'shipped'; -- 示例:错误地使用了函数导致索引失效 SELECT * FROM users WHERE YEAR(birthdate) = 1990; -- 示例:违反最左前缀原则 SELECT * FROM employees WHERE department = 'Sales' AND position = 'Manager'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值