mysql: MySQL中between子句和limit子句的区别

一、核心区别(一句话)

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;

执行逻辑:

  1. 使用主键索引定位到 id = 100

  2. 顺序扫描

  3. 扫描到 10 行后立即停止

这是高性能分页/截断查询的典型写法。


六、典型使用场景对比

场景 适合 BETWEEN 适合 LIMIT
按数值区间筛选
时间范围查询
只取前 N 条
分页查询
大表范围扫描
防止返回过多数据

七、一个非常常见的误区

误区:LIMIT 可以代替 BETWEEN

假如要查找最新插入的100条数据

复制代码
-- 错误理解
SELECT * FROM orders LIMIT 100;

问题:

  • 不保证是"最新 100 条"

  • 不保证顺序

正确写法:

复制代码
SELECT * 
FROM orders
ORDER BY created_at
LIMIT 100;

八、性能相关的延伸

  1. BETWEEN过滤条件,减少扫描行数

  2. LIMIT短路机制,减少返回行数

  3. 二者配合,性能最好

  4. 深分页场景中:

    复制代码
    LIMIT 100000, 10

    性能很差,应改为 基于索引的范围分页


九、对比总结表

对比维度 BETWEEN LIMIT
作用 限定值范围 限定行数
所属子句 WHERE 结果阶段
是否过滤数据
是否依赖索引 是(强) 否(弱)
是否影响扫描范围

相关推荐
代码搬运媛5 小时前
Jest 测试框架详解与实现指南
前端
counterxing6 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq6 小时前
windows下nginx的安装
linux·服务器·前端
之歆6 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
星星也在雾里6 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
发现一只大呆瓜7 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108087 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
candyTong7 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
雨辰AI8 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20248 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列