李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 中间件
  3. 正文

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

2026年1月15日 266 0 0
本文最后更新于 2026年1月15日,距今已 283 天,其中的信息可能已经发生变化,请注意甄别。

核心结论先明确:在绝大多数数据库(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 月 25 日

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

  • 7 年前 2019年10月25日
    JAVA简单快速的读写Excel之EasyExcel

    简介 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M…

  • 原创
    7 年前 2019年10月25日
    CentOS安装docker

    安装依赖包: $ sudo yum install -y yum-utils \ device-mapper-persi…

相关文章
  • 分布式之数据库和缓存双写一致性方案解析2019年10月30日
  • Hibernate、MyBatis的简介、区别以及优化2019年8月20日
  • AI原生数据库新标杆:seekdb深度解析,轻量架构与混合搜索的双重革命2025年12月17日
  • Spring Boot 2.5.0重新设计的spring.sql.init 配置有啥用?2021年5月29日
  • 为什么MySQL要“小表驱动大表”2025年11月4日

李锋镝

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

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

文章评论

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

桃李春风一杯酒,江湖夜雨十年灯。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619) 聊一聊DeepSeek开放自研搜索API这事 Let's Encrypt宣布证书缩短至64天,手动时代彻底终结! Markdown 的前世今生
给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能
Claude Code提示词优化指南:从"瞎写"到"高效生成",开发效率提升10倍的实战秘籍 AI原生数据库新标杆:seekdb深度解析,轻量架构与混合搜索的双重革命 Python 3.12并发革命:大厂争相升级的底层逻辑与实战指南 k8s部署服务到集群中的指定节点 Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法 Docker打包部署示例
最近评论
老张博客 发布于 5 小时前(10月25日) 昨天晚上我分了两个插件出来,AI说,主题就应该是主题该有的样子。呵呵
李锋镝 发布于 12 小时前(10月25日) 好主意,等我有时间了拆分一下
老张博客 发布于 1 天前(10月24日) 可以把这个功能做成插件 我的那个主题也集成了很多功能,我现在想把他们都分出去做成插件。这样以后换主...
李锋镝 发布于 2 天前(10月23日) 哈哈哈,确实,经常有些网站证书过期的
李锋镝 发布于 2 天前(10月23日) 这样更省事
标签聚合
JVM 日常 数据库 K8s Spring 多线程 AI Claude MySQL ElasticSearch Theme AI编程 分布式 JAVA SpringBoot 架构 SQL Redis IDEA WordPress
友情链接
  • Honesty
  • 搬砖日记
  • 刘永博客
  • 彬红茶日记
  • 皮皮社
  • 懋和道人
  • 老张博客
  • lijie blog
  • Mr.Sun的博客
  • 瓦匠个人小站
  • 志文工作室
  • 林羽凡
  • sssr7844的博客
  • 九仞之行
  • 韩小韩博客
  • 韩情脉脉
  • Serendipity
  • 知向前端
  • 哥斯拉

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号