企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 结论 使用不使用索引,并不是用了 or in 等就不用索引了,而是**MySQL会预估查询结果数量,判断全表查询和使用索引那种方式更加高效**,当 or in 等查询的结果集在总数据中占比过大,就有可能使用全表查询了。 ## in 走索引 ![](https://img.kancloud.cn/8b/01/8b016de15341dc1d826fb50351aee27b_919x264.png) ## or 也走索引 ![](https://img.kancloud.cn/3d/85/3d851bde2703c3fa6062f30d49c88424_907x310.png) ## != 也走索引 ![](https://img.kancloud.cn/a7/13/a713023353d13deb0251544d4aa52839_912x312.png) ## != 的结果集太大,全表扫描了 ![](https://img.kancloud.cn/16/42/1642f896451568684512245a9947465b_909x318.png) ## or 、 in、!= 的结果集数据在表中占比不高时,就会使用索引。 并非 只要存在 or 、in、 != ,就不走索引,这要看具体情况 应该是MySQL预估or 或 in 的走索引和全表扫描性能差不多。比如1000万条数据,or 、 in、 != 走索引的结果集是999万,这时候和全表扫描差不多,MySQL就不走索引了。 ## 简单内连接没走索引 内连接和查询条件上都有索引 ![](https://img.kancloud.cn/a0/a4/a0a42ce689263ce6d4f08dae9d36a077_913x369.png) 没走索引的内连接 ![](https://img.kancloud.cn/f6/46/f646a3e85193f27897d31efda425f038_882x399.png) ### 原因: 测试数据一共85条,s.\_id = 1103 的总共78条,1113 7条,MySQL在查询前会预估查询结果条数,内连接走索引估计还需要回表或其他操作,导致效率不如全表查询。 将条件换为1113, 结果正常走索引。 ![](https://img.kancloud.cn/77/c2/77c2191a875abad22a59b013a0e1973c_855x366.png)