查看: 140|回复: 0

MySQL中between子句和limit子句的区别解析

[复制链接]

9

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2009-12-18
发表于 2025-12-30 11:31:06 | 显示全部楼层 |阅读模式

一、核心区别(一句话)

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
  • 性能很差,应改为 基于索引的范围分页

九、对比总结表

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

圆梦公社,专注于为全球华人提供纯粹技术交流的地方,请勿发布任何政治及违法的言论。如有相关侵权、举报、投诉及建议等,请发 E-mail:dzh188@hotmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部