mysql 不走索引的情形

本文列举了导致MySQL数据库中索引失效的八种常见情形,包括对null值的判断、使用!=或<>操作符等,并提供了具体的示例帮助理解。

mysql 不走索引的情形:


1. null 值判断;


2. != , <> 操作符;


3. or(大多数情况下);


4. in(大多数情况下);


5. like的使用(大多数情况下);


6. where 子句中对字段进行表达式操作,eg: select id from t where num/2=100 ;


7. 在 where 子句中对字段进行函数操作


8. 在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算;

转载于:https://my.oschina.net/newchaos/blog/1573633

### MySQL范围查询中索引失效的原因 在MySQL范围内查询时,即使已经为`create_date`列创建了索引,但如果查询返回的数据行过多,MySQL可能会选择全表扫描而是使用索引,因为在这种情况下,全表扫描可能更高效[^1]。 对于复合索引的情况,例如`(age, name)`,当查询条件涉及`age=18 and name>&#39;xx&#39;`时,虽然`age`部分的索引仍然有效,但由于存在范围查询(`name>`),这使得后续的`name`索引变得无效。因此,在相同年龄的情况下,按照`name`排序的操作会利用到索引[^2]。 ### 解决方案 #### 优化查询语句结构 为了提高性能并促使MySQL使用已有的索引,可以通过调整SQL语句来减少返回的结果集数量或改变查询模式: - **缩小时间窗口**:通过减小日期区间或其他过滤条件的宽度,降低满足条件记录的数量。 - **增加额外筛选条件**:引入更多精确度高的等值匹配项作为前置条件,帮助数据库引擎更好地定位目标数据。 ```sql -- 原始查询可能导致索引未被充分利用 SELECT * FROM table_name WHERE create_date >= &#39;start-date&#39; AND create_date <= &#39;end-date&#39;; -- 改进后的查询增加了其他限定条件以促进索引应用 SELECT * FROM table_name WHERE status = &#39;active&#39; AND user_type IN (&#39;admin&#39;, &#39;vip&#39;) AND create_date BETWEEN &#39;start-date&#39; AND &#39;end-date&#39;; ``` #### 强制使用特定索引 有时为了让MySQL优先考虑某个特别设计过的索引来加速查询过程,可以显式指定要使用的索引名称: ```sql FORCE INDEX (index_name) ``` 此方法适用于知道确切哪个索引最有利于当前查询场景的情形下。过需要注意的是,过度依赖这种方式并总是最佳实践,因为它绕过了查询优化器的选择机制。 #### 定期维护统计信息 保持最新的统计数据有助于查询优化器做出更好的决策。定期运行ANALYZE TABLE命令可以帮助更新有关表内数据分布的信息,从而改善索引利用率: ```sql ANALYZE TABLE your_table; ``` 此外,还可以借助于EXPLAIN关键字查看具体的执行计划,确认是否确实采用了预期中的索引路径,并据此进一步调优查询逻辑或者重新评估现有索引的设计合理性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值