一、核心区别(一句话)
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 | 结果阶段 |
| 是否过滤数据 | 是 | 否 |
| 是否依赖索引 | 是(强) | 否(弱) |
| 是否影响扫描范围 | 是 | 否 |
到此这篇关于mysql: mysql中between子句和limit子句的区别的文章就介绍到这了,更多相关mysql between子句和limit内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论