李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 系列文章
  • AI工具集
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
白雪成红
惟坚韧者始能遂其志
  1. 首页
  2. 中间件
  3. 正文

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

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

核心结论先明确:在绝大多数数据库(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,开区间用 >/<),无需纠结性能,重点保证索引生效即可。

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

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

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

微信扫一扫分享

标签: SQL 数据库
最后更新:2026年1月15日

岁月同一天 10 月 11 日

回望过去的今天,你在写什么

  • 中间件
    1 年前 2025年10月11日
    Kafka 为什么要抛弃 Zookeeper?

    Kafka 抛弃 Zookeeper(引入 KRaft 模式)是为了解决长期依赖 Zookeeper 带来的性能瓶颈、架…

  • 中间件
    1 年前 2025年10月11日
    高性能场景为什么推荐使用PostgreSQL,而非MySQL?

    在高性能场景(如高并发读写、复杂查询、大数据量存储、多维度数据处理等)中,PostgreSQL 常被优先推荐,核心原因在…

  • 原创
    7 年前 2019年10月11日
    JAVA关键字之volatile关键字说明

    volatile作用 volatile主要是为了解决多线程内存不可见问题。 对于一写多读,是可以解决变量同步问题,但是如…

相关文章
  • MySQL 的自增 ID 用完了,怎么办?2021年3月30日
  • 数据库中的锁-SQL Server版2019年10月9日
  • 使用AbstractRoutingDataSource动态切换数据源2025年3月15日
  • mybatis-plus-join-boot-starter介绍及用法2025年4月24日
  • Hibernate、MyBatis的简介、区别以及优化2019年8月20日

李锋镝

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

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

文章评论

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

我有一瓢酒,可以慰风尘。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
讨论下XXL-JOB GLUE模式的安全问题 心气没了,干什么都不得劲 Kratos-plus v1.1.26版本更新说明 我觉得是时候公布我的导航网站了 代码是 AI 写的,生产事故谁背锅? 给主题增加了游客中心功能
给主题增加了游客中心功能我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能心气没了,干什么都不得劲
从零开始入门 K8s | Kubernetes 网络概念及策略控制 JVM安全点介绍 妹妹的画【2019.07.13】 为什么说不可信的Wi-Fi不要随便连接? 使用Spring MVC的websocket配置时 Tomcat启动报错 设计模式总结
最近评论
老张博客 发布于 14 小时前(10月10日) NAS现在就不要搞了吧,除非你手里有内存和硬盘。
李锋镝 发布于 20 小时前(10月10日) 确实,很多不必要的东西,买了回来也是吃灰……
林羽凡 发布于 23 小时前(10月10日) 一个是不想折腾了,另一个有些觉得没必要的折腾或购买,想想就会算了。
李锋镝 发布于 23 小时前(10月10日) 少年老成吧大概是 :21:
Hary 发布于 23 小时前(10月10日) 我也是这样,感觉都不想折腾了,我还没到中年呢吧啊啊啊
标签聚合
Spring SpringBoot 多线程 AI编程 架构 ElasticSearch 日常 K8s JAVA Redis WordPress MySQL IDEA Claude SQL Theme AI JVM 分布式 数据库
友情链接
  • 皮皮社
  • 彬红茶日记
  • 哥斯拉
  • lijie blog
  • 老张博客
  • Honesty
  • 懋和道人
  • 九仞之行
  • 韩情脉脉
  • 志文工作室
  • 瓦匠个人小站
  • 韩小韩博客
  • 搬砖日记
  • sssr7844的博客
  • 知向前端
  • Serendipity
  • Mr.Sun的博客
  • 林羽凡

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号