mysql between in_sql 优化问题,between比in好?

本文探讨了MySQL中BETWEEN和IN操作在性能上的差异。BETWEEN通常在处理连续数值时表现更好,因为它减少了解析次数。然而,当IN的范围达到一定比例(约25%-35%)时,可能会触发全表扫描。具体是否走全表扫描取决于数据分布和查询内容是否匹配索引。此外,BETWEEN在磁盘寻址时能有效利用连续数据的特性,减少多次寻址。举例展示了不同数量的IN值对查询计划的影响。
摘要由CSDN通过智能技术生成

连续数值当然between好了 减少解析 并且in的范围默认超过一定数目就会走全表 9个还是多少忘了

针对楼下评论再补充一下答案:

in走全表是分情况的,上面的解答只是凭记忆大概说了一下,楼下小伙伴比较认真,这里就再解释一下,这个不是个数而应该是个比例,大概25%-35%左右,你要再问到底多少不好意思水平有限不读源码没办法确认。然后这个30左右的比例也并不是说一定走全表扫描,因为mysql还有一个索引扫描,就是说如果select的内容在你的索引里面就能找到的话当然不会去扫全表了,比如下面的例子中select id from ttt where id in (..);和select * from ttt where id in (...);前面这个肯定是走主键扫描,即使你in了所有id值他也是走主键,而后面的情况就是这种百分比的情况了,具体看下面示例,欢迎指正^_^

额,然后还想说一下between的情况,为什么好是因为除了索引段上连续存取减少解析以外,还有一个情况就是在磁盘寻址检索数据的时候,会默认读取第一次取值附近的部分数据(有这么一个概率算法说的是当一个数据被检索到的时候,他附近的数据也很大概率会被用到)所以就有了这么一个一次性取出冗余数据避免多次寻址的情况,这时候使用between的连续取值就正适用了

mysql> select * from ttt;

+----+-------------------+

| id | name |

+----+-------------------+

| 1 | I17021234001 |

| 2 | IC17031234002 |

| 3 | C17041234003 |

| 4 | IAsEw1234001 |

| 5 | I17021234001A2 |

| 6 | IC17031234002A2 |

| 7 | C17041234003A2 |

| 8 | IAsEw1234001A2 |

| 9 | I17021234001A2 |

| 10 | IC17031234002A2 |

| 11 | C17041234003A2 |

| 12 | IAsEw1234001A2 |

| 13 | I17021234001A2A2 |

| 14 | IC17031234002A2A2 |

| 15 | C17041234003A2A2 |

| 16 | IAsEw1234

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值