Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql中between和in的区别

mysql中关于between和in的区别

作者:两菜一汤、

这篇文章主要介绍了mysql中关于between和in的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql中between和in的区别

下面两条语句有什么区别,为什么都提倡使用范围查询 ?

select * from T where k in(1,2,3,4,5)
select * from T where k between 1 and 5

其实between和in这两个关键字应用的场景重合度并不高,但是我们可以通过思考这么一个问题,来理清这两者执行的执行过程和逻辑。

要回答这个问题就需要先了解索引的数据结构,以及mysql索引利用b+树执行查询的执行过程,这里先默认大家具备了这个条件。

先区分下可能的情况。

第一个是k字段是主键,第二个是k字段是二级索引,第三种情况是k是普通字段。

另外,我们需要搞清楚in关键字和between两种查询方式在执行的时候的不同之处;

k是主键索引和二级索引的情况是相似的,唯一的区别就是二级索引的话可能需要回表,回表不是这次讨论的重点,所以我们把这两种情况合并到一起说;

in 条件实际查询的时候是多次搜索索引树,而 between 条件只需要执行一次搜索树的查询就可以获得结果,本题为例,加入索引的底层实现结构使用的是b+树,使用关键字 in 要树搜素5次,也就是做5次等值查询;而 bewteen 基于b+树的范围查询逻辑,当找到第一个满足条件的叶子节点后,根据当前叶子节点指向的下一个叶子节点继续查询,直到查到不满足条件的叶子节点,所以只需要树搜索一次。

而对于k不是索引的情况,in条件相当于执行了多次的全文遍历,而between其实也是全文遍历,都不是一个好的方式。

mysql条件查询语句between and和in的效率比较

工作需要,写按sensor_uuid在某范围查询的语句:

1.

select * from xz_sensor_data where sensor_time>='2019-03-28 00:00:00.000' and sensor_time<='2019-03-28 08:00:00.000' and sensor_uuid in('20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','201901','201902','201903','201904','201905','201906','201907','201908','201909','201910','201911','201912','201913')  order by sensor_time asc

2.

select * from xz_sensor_data where sensor_time>='2019-03-28 00:00:00.000' and sensor_time<='2019-03-28 08:00:00.000' and (sensor_uuid  between '19' and '36' or sensor_uuid between '201900' and '201914' )

发现第二条执行效率高。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文