核心结论先明确:在绝大多数数据库(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 还是 >/<:
-
索引是否生效
- 有B-tree索引(数值/日期/字符串列):范围查询性能极优(仅扫描索引范围内的数据);
- 无索引/索引失效(如列加了函数、用了不等于/OR等):全表扫描,性能差(和运算符无关)。
-
范围大小
- 小范围(如查1天的数据):即使全表扫描也快;
- 大范围(如查1年的数据):必须依赖索引,否则性能极差。
-
数据库版本/优化器
- 老旧数据库(如MySQL 5.5及更早)对复杂范围的解析略慢,但
BETWEEN AND和>=/<=仍无差异; - 新版本数据库(MySQL 8.0/Oracle 19c)优化器更智能,二者执行效率完全对齐。
- 老旧数据库(如MySQL 5.5及更早)对复杂范围的解析略慢,但
四、使用建议(性能+可读性兼顾)
-
优先用
BETWEEN AND:- 场景:需要「闭区间」范围查询(包含边界值);
- 优势:代码更简洁,可读性更高(比如
time BETWEEN '2026-01-01' AND '2026-01-15'比time >= ... AND time <= ...更易读)。
-
用
>/<组合:- 场景:需要「开区间」范围查询(排除边界值);
- 注意:避免写成
age > 18 AND age < 30替代BETWEEN 19 AND 29(逻辑等价但可读性差)。
-
避坑点:
- 日期范围查询时,
BETWEEN '2026-01-01' AND '2026-01-31'等价于<= '2026-01-31 00:00:00',会漏掉31日的所有时间数据,此时必须用<= '2026-01-31 23:59:59'或<'2026-02-01',这是逻辑问题而非性能问题。
- 日期范围查询时,
总结
- 性能层面:
BETWEEN AND和>=/<=组合完全等价,无性能差异; - 逻辑层面:
BETWEEN AND是闭区间,>/<可灵活控制开/闭区间; - 核心优化:范围查询性能的关键是「列是否有有效索引」,而非运算符选择。
简单来说:按业务逻辑选择写法(闭区间用 BETWEEN AND,开区间用 >/<),无需纠结性能,重点保证索引生效即可。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接
文章评论