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