一、核心区别(一句话)
BETWEEN用来“限定数据的取值范围”,属于过滤条件;LIMIT用来“限定返回的行数”,属于结果裁剪。
两者解决的问题不同,不能互相替代。
二、语义层面的本质区别
1. BETWEEN(范围条件)
|
1
|
WHERE id BETWEEN 10 AND 20 |
含义:
- 按 列的取值范围 过滤数据
- 左右边界都包含(闭区间)
- 属于
WHERE条件的一部分
等价写法:
|
1
|
WHERE id >= 10 AND id <= 20 |
2. LIMIT(数量限制)
|
1
2
|
LIMIT 10LIMIT 10 OFFSET 20 |
含义:
- 不关心值是什么
- 只限制返回多少行
- 在结果集生成后再裁剪
- 如果存在偏移量,从指定的偏移量开始查询的位置
三、执行顺序上的区别(非常关键)
SQL 的逻辑执行顺序(简化):
|
1
2
3
4
|
FROM→ WHERE ← BETWEEN 在这里生效→ ORDER BY→ LIMIT ← LIMIT 在这里生效 |
结论:
BETWEEN影响 参与计算的行LIMIT只影响 最终返回的行数
四、索引利用上的差异(性能重点)
1. BETWEEN 与索引
|
1
|
SELECT * FROM user WHERE id BETWEEN 100 AND 200; |
id是主键 / 有索引- 使用 B+Tree 范围扫描
- 从第一个匹配值开始,顺着叶子链表扫描
- 高效
2. LIMIT 与索引
|
1
|
SELECT * FROM user ORDER BY id LIMIT 10; |
- 如果
ORDER BY id有索引 - 可以顺序扫描索引前 10 行
- 同样高效@www.xuepai.net
但:
|
1
|
SELECT * FROM user LIMIT 10; |
- 无排序语义
- 返回结果不稳定
- 通常仍需扫描
五、BETWEEN + LIMIT联合使用(高频实战)
|
1
2
3
4
5
|
SELECT * FROM userWHERE id BETWEEN 100 AND 10000ORDER BY idLIMIT 10; |
执行逻辑:
- 使用主键索引定位到
id = 100 - 顺序扫描@www.haoshilao.net
- 扫描到 10 行后立即停止
这是高性能分页/截断查询的典型写法。
六、典型使用场景对比
| 场景 | 适合 BETWEEN | 适合 LIMIT |
|---|---|---|
| 按数值区间筛选 | 是 | 否 |
| 时间范围查询 | 是 | 否 |
| 只取前 N 条 | 否 | 是 |
| 分页查询 | 否 | 是 |
| 大表范围扫描 | 是 | 否 |
| 防止返回过多数据 | 否 | 是 |
七、一个非常常见的误区
误区:LIMIT 可以代替 BETWEEN
假如要查找最新插入的100条数据
|
1
2
|
-- 错误理解SELECT * FROM orders LIMIT 100; |
问题:
- 不保证是“最新 100 条”
- 不保证顺序
正确写法:
|
1
2
3
4
|
SELECT * FROM ordersORDER BY created_atLIMIT 100; |
八、性能相关的延伸
BETWEEN是 过滤条件,减少扫描行数LIMIT是 短路机制,减少返回行数- 二者配合,性能最好
- 深分页场景中:
|
1
|
LIMIT 100000, 10 |
- 性能很差,应改为 基于索引的范围分页
九、对比总结表
| 对比维度 | BETWEEN | LIMIT |
|---|---|---|
| 作用 | 限定值范围 | 限定行数 |
| 所属子句 | WHERE | 结果阶段 |
| 是否过滤数据 | 是 | 否 |
| 是否依赖索引 | 是(强) | 否(弱) |
| 是否影响扫描范围 | 是 | 否 |