李锋镝的博客

  • 首页
  • 时间轴
  • 评论区显眼包🔥
  • 左邻右舍
  • 博友圈
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
  • 留言
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 中间件
  3. 正文

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

2026年1月15日 70点热度 0人点赞 0条评论

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

相关文章

  • 千万级大表新增字段实战指南:告别锁表与业务中断
  • 深入了解PostgreSQL
  • 分库分表正在被淘汰?NewSQL与分库分表的深度博弈与选型指南
  • 数据库事务的隔离级别
  • 数据库事务的一点简单总结
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: SQL 数据库
最后更新:2026年1月15日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >

文章评论

1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
取消回复

秋天是倒放的春天,晚安是爱你的序篇。

那年今日(02月10日)

  • 1953年:穆罕默德·纳吉布出任埃及总统
  • 1923年:德国物理学家、X射线发现者伦琴逝世
  • 1898年:德国戏剧家贝尔托·布莱希特出生
  • 1894年:英国政治家哈罗德·麦克米伦出生
  • 589年:杨坚灭陈朝,南北朝结束
  • 更多历史事件
最新 热点 随机
最新 热点 随机
Apollo配置中心中的protalDB的作用是什么 org.apache.ibatis.plugin.Interceptor类详细介绍及使用 JDK25模块级导入深度解析:Java导入机制的革命性进化 AI时代,个人技术博客的出路在哪里? 什么是Meta Server? 千万级大表新增字段实战指南:告别锁表与业务中断
玩博客的人是不是越来越少了?AI时代,个人技术博客的出路在哪里?准备入手个亚太的ECS,友友们有什么建议吗?使用WireGuard在Ubuntu 24.04系统搭建VPNWordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了
JWT、Cookie、Session、Token 区别与实战选型指南 Spring Boot 2.5.0重新设计的spring.sql.init 配置有啥用? 微服务的数据库设计 MySQL数据库详解——执行SQL更新时,其底层经历了哪些操作? AI重构开发者工作范式:从Anthropic内部调研看Claude对研发领域的深层影响 使用Spring MVC的websocket配置时 Tomcat启动报错
标签聚合
Spring K8s docker JAVA JVM 分布式 数据库 SpringBoot AI IDEA Redis 日常 AI编程 MySQL 多线程 SQL 设计模式 WordPress ElasticSearch 架构
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 蜗牛工作室
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos Made By Dylan

津ICP备2024022503号-3

京公网安备11011502039375号