李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于我
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 中间件
  3. 正文

在 SQL 中做范围查询时,使用 BETWEEN AND 和直接用 >/=/<= 这类比较运算符,哪一个的性能更优。

2026年1月15日 约 1,091 字4 分钟 124 0 0
本文最后更新于 2026年1月15日,距今已 238 天,其中的信息可能已经发生变化,请注意甄别。

核心结论先明确:在绝大多数数据库(MySQL/Oracle/PostgreSQL等)中,二者的性能几乎完全一致,因为数据库优化器会将 BETWEEN AND 自动等价转换为 >= + <= 的组合。性能差异的关键不在运算符本身,而在「是否能利用索引」「范围边界的合理性」。

一、底层逻辑:BETWEEN AND 是语法糖

BETWEEN AND 本质是数据库提供的「语法简化工具」,而非特殊的执行逻辑。

  • 例如:age BETWEEN 18 AND 30
    优化器会自动解析为:age >= 18 AND age <= 30
  • 例如:create_time BETWEEN '2026-01-01' AND '2026-01-15'
    等价于:create_time >= '2026-01-01' AND create_time <= '2026-01-15'

数据库执行计划(EXPLAIN)会显示二者的执行逻辑完全相同:

  • 有索引时:均走「索引范围扫描(RANGE SCAN)」;
  • 无索引时:均走「全表扫描(TABLE SCAN)」。

二、唯一可能的性能差异:边界值处理(非性能本身,是逻辑)

虽然性能无差异,但需注意 BETWEEN AND 的「闭区间特性」可能间接影响结果集大小,进而看似“性能不同”:

写法 逻辑等价 结果集特点 适用场景
age BETWEEN 18 AND 30 age >=18 AND age <=30 包含18和30(闭区间) 明确需要包含边界值
age >18 AND age <30 无等价简化 排除18和30(开区间) 明确需要排除边界值

示例(MySQL实操):
假设有 user 表(100万行,age 列有B-tree索引),执行计划完全一致:

-- 写法1:BETWEEN AND
EXPLAIN SELECT * FROM user WHERE age BETWEEN 18 AND 30;
-- 执行计划:type=range,key=age(走age索引,范围扫描)

-- 写法2:>= + <=
EXPLAIN SELECT * FROM user WHERE age >= 18 AND age <= 30;
-- 执行计划:和上面完全一致,rows/Extra等字段无差异

-- 写法3:> + <(逻辑不同,结果集更小,但执行方式仍一致)
EXPLAIN SELECT * FROM user WHERE age > 18 AND age < 30;
-- 执行计划:仍走age索引,仅扫描范围缩小为(18,30)

三、影响性能的核心因素(与运算符无关)

真正决定范围查询性能的是以下几点,而非用 BETWEEN AND 还是 >/<:

  1. 索引是否生效

    • 有B-tree索引(数值/日期/字符串列):范围查询性能极优(仅扫描索引范围内的数据);
    • 无索引/索引失效(如列加了函数、用了不等于/OR等):全表扫描,性能差(和运算符无关)。
  2. 范围大小

    • 小范围(如查1天的数据):即使全表扫描也快;
    • 大范围(如查1年的数据):必须依赖索引,否则性能极差。
  3. 数据库版本/优化器

    • 老旧数据库(如MySQL 5.5及更早)对复杂范围的解析略慢,但 BETWEEN AND 和 >=/<= 仍无差异;
    • 新版本数据库(MySQL 8.0/Oracle 19c)优化器更智能,二者执行效率完全对齐。

四、使用建议(性能+可读性兼顾)

  1. 优先用 BETWEEN AND:

    • 场景:需要「闭区间」范围查询(包含边界值);
    • 优势:代码更简洁,可读性更高(比如 time BETWEEN '2026-01-01' AND '2026-01-15' 比 time >= ... AND time <= ... 更易读)。
  2. 用 >/< 组合:

    • 场景:需要「开区间」范围查询(排除边界值);
    • 注意:避免写成 age > 18 AND age < 30 替代 BETWEEN 19 AND 29(逻辑等价但可读性差)。
  3. 避坑点:

    • 日期范围查询时,BETWEEN '2026-01-01' AND '2026-01-31' 等价于 <= '2026-01-31 00:00:00',会漏掉31日的所有时间数据,此时必须用 <= '2026-01-31 23:59:59' 或 <'2026-02-01',这是逻辑问题而非性能问题。

总结

  1. 性能层面:BETWEEN AND 和 >=/<= 组合完全等价,无性能差异;
  2. 逻辑层面:BETWEEN AND 是闭区间,>/< 可灵活控制开/闭区间;
  3. 核心优化:范围查询性能的关键是「列是否有有效索引」,而非运算符选择。

简单来说:按业务逻辑选择写法(闭区间用 BETWEEN AND,开区间用 >/<),无需纠结性能,重点保证索引生效即可。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/zhong-jian-jian/4677

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

在 SQL 中做范围查询时,使用 BETWEEN AND 和直接用 >/</>=/<= 这类比较运算符,哪一个的性能更优。

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: SQL 数据库
最后更新:2026年1月15日
相关文章
  • 从SQL规范性检查、表结构索引检查着手分析如何优化SQL2021年3月3日
  • MySQL 中的 distinct 和 group by 哪个效率更高?2023年2月16日
  • 数据库事务的一点简单总结2019年9月2日
  • 从万级到千万级:排行榜系统的6种实现方案深度解析(含原理、优化与实战)2025年10月29日
  • 图数据库选型:Neo4j、Janus、HugeGraph2023年1月11日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复

文章评论

还没有评论,快来抢沙发吧~

黑夜给了我黑色的眼睛,我却用它寻找光明。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
推荐一个SVG 矢量小图标免费下载网站 关于使用AI的一些思考 book-to-skill:GitHub2.7万star开源项目,将书籍蒸馏为Agent可调用技能 最近厄尔尼诺现象越来越猛了 Kratos-plus v1.1.20版本更新说明 实用skills介绍之:Ponytail
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页写了一个订阅每日新闻的WP插件
MySQL数据库详解——执行SQL查询语句时,其底层到底经历了什么? Java并发编程之如何保证线程顺序执行 如何通过命令查看Java应用内存中对象数量 AI 编程高效提示词模板库(2025 实战版) 重构 Controller 终极指南:从臃肿到优雅的 7 大黄金法则 + 实战技巧 再小的应用也有架构,面向架构新手的架构实践!
最近评论
blank
李锋镝 发布于 6 小时前(09月10日) 可以试一试万能的重启
blank
obaby 发布于 6 小时前(09月10日) 今天早上这个插件莫名奇妙完犊子了,直接卸载了。哈哈哈
blank
李锋镝 发布于 6 小时前(09月10日) 哈哈哈~
blank
李锋镝 发布于 6 小时前(09月10日) 那个也好用,就是每次得登录账号,就比较麻烦
blank
李锋镝 发布于 6 小时前(09月10日) 那个我也用了一段时间,感觉也挺好使的,不过现在换了Redis
标签聚合
ElasticSearch 多线程 Redis AI SQL MQ 架构 AI编程 Spring WordPress SpringBoot 日常 IDEA MySQL Claude JVM K8s JAVA 数据库 分布式
友情链接
  • 韩小韩博客
  • sssr7844的博客
  • Mr.Sun的博客
  • 老张博客
  • 志文工作室
  • 瓦匠个人小站
  • 皮皮社
  • 林羽凡
  • 懋和道人
  • 临窗旋墨
  • 哥斯拉
  • 知向前端
  • Serendipity
  • 蜗牛工作室
  • 韩情脉脉
  • 九仞之行
  • 若梦博客
  • 搬砖日记
  • 彬红茶日记
  • Honesty

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

正在博友圈履约中

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号