MySQL数据库中如何限制查询返回的记录行数?

浅强君_3383

浅强君_3383

2026-07-18

557人浏览

原创

limit必须放在select语句末尾且严格位于order by之后;不配order by会导致结果不可靠,大offset性能极差,分页需用主键补位排序并避免在视图或update/delete中误用。

mysql数据库中如何限制查询返回的记录行数?

LIMIT 是唯一标准方式,但写错位置、不配 ORDER BY、滥用大 OFFSET,都会让结果不可靠或查询变慢。

LIMIT 必须放在 SELECT 末尾,且只能在 ORDER BY 之后

MySQL 语法强制要求 LIMIT 是整个查询的最后一个子句。它不是函数,也不是独立语句,不能写成 LIMIT(10)、LIMIT 10 单独一行,更不能插在 WHERE 或 GROUP BY 中间。

  • 错误写法:SELECT * FROM users WHERE id > 10 LIMIT 5 GROUP BY status → 触发 ERROR 1064
  • 正确顺序:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
  • 没 ORDER BY 也能用 LIMIT,但返回哪几行完全不确定——InnoDB 表在并发写入下,两次执行 SELECT * FROM logs LIMIT 5 可能返回完全不同记录

分页必须用 ORDER BY + 主键补位,否则会漏数据或重复

只写 ORDER BY price DESC 很危险:多个商品 price 相同,MySQL 排序时物理顺序不固定,导致同一 LIMIT 20, 10 在不同请求中可能跳过某些行或重复返回。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 安全写法:ORDER BY price DESC, id DESC —— 用主键兜底,确保排序唯一
  • 时间字段分页也一样:ORDER BY created_at DESC, id DESC,并建联合索引 (created_at, id)
  • 别用 ORDER BY RAND() 分页:无法走索引,大表必全表扫描

LIMIT offset, row_count 越大越慢,不是语法问题,是执行逻辑决定的

查第 1000 页(每页 20 条)写成 LIMIT 19980, 20,MySQL 不会“跳”过去,而是先完整扫描、排序所有匹配行,再丢弃前 19980 行。哪怕只取 20 条,也要处理至少 20000 行。

  • OFFSET 超过 10000 就该警惕;真实线上场景中,LIMIT 100000, 20 常伴随 Using filesort 和高延迟
  • 优化不是调 LIMIT 参数,而是换策略:记住上一页最后一条的 id,下一页写 WHERE id > 54321 ORDER BY id LIMIT 20
  • 视图里不能写 LIMIT(会报 ERROR 1349),必须在外层加;但视图定义里没 ORDER BY,外层加也救不了顺序问题

UPDATE/DELETE 里不能直接用 LIMIT,除非关安全模式或显式加 WHERE

默认开启 Safe Update Mode 时,DELETE FROM logs WHERE created_at 会报 <code>ERROR 1175,这不是语法错误,而是客户端保护机制。

  • 临时绕过:SET SQL_SAFE_UPDATES = 0,但风险自担
  • 更稳妥做法:用子查询锁定目标 ID 集合,再删,例如 DELETE FROM logs WHERE id IN (SELECT id FROM (SELECT id FROM logs WHERE created_at
  • UPDATE ... ORDER BY ... LIMIT 在 InnoDB 下有效,但 MyISAM 行为不一致,不建议跨引擎依赖

真正容易被忽略的,是 LIMIT 的性能代价和排序依赖完全透明——你写对了语法,不代表查询就快;加了索引,也不代表 LIMIT 就能跳过扫描。关键不在怎么写,而在是否理解它背后是“全量排序后截断”,而不是“精准定位”。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4063

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

871

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1049

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5921

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2843

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5900

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7881

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1070

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

932

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 181人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 289人学习