LIMIT 的基本用法与常见形式
基本语法与两种写法
本篇聚焦 MySQL LIMIT 用法讲解,讲解如何正确限制返回条数、避免常见坑并提升性能。 LIMIT 是 SQL 查询中用于控制返回行数的关键子句,合理使用可以显著降低网络传输与应用端处理成本。
常见写法一:LIMIT row_count,用于直接取指定数量的行,适合获取前 N 条数据。示例如下所示:
SELECT id, name FROM users ORDER BY id ASC LIMIT 10;
常见写法二:LIMIT offset, row_count,通过偏移量跳过前面的若干行后再取指定数量,常用于分页场景。示例如下:
SELECT id, name FROM users ORDER BY id ASC LIMIT 20, 10;
LIMIT row_count OFFSET offset 的写法在部分 MySQL 版本中也有良好支持,语义与上述 LIMIT offset, row_count 相同,便于与标准的 OFFSET 子句对齐。
LIMIT 与 ORDER BY 的正确组合
在分页场景中确保排序的稳定性
在分页查询中,强烈建议结合 ORDER BY 进行排序,以避免返回的行在不同页之间产生错位。 未排序的 LIMIT 可能导致结果不可预测,尤其在数据频繁变动的表中。
对分页字段建立合适的索引,能显著提升性能。 当 ORDER BY 的列具备索引时,数据库可以更高效地定位起始点并按需取数。
示例:优先对排序字段建立复合索引,如按 id 进行分页时,确保(id)或(id, 其他列)有索引支持,以避免全表扫描。
SELECT id, name FROM users ORDER BY id ASC LIMIT 10 OFFSET 100;避免 LIMIT 的常见坑
大偏移量带来的性能问题
当 offset 很大时,MySQL 需要先扫描并丢弃大量中间行,导致大量 I/O 和 CPU 开销。 这在大数据量表的分页场景尤为明显。
为了降低这种开销,可以采用键值分页(keyset pagination)或分段查询等替代方案。 以主键或唯一键为分页锚点,避免大偏移的全表扫描。
-- 键值分页示例(从 last_id 开始取)
SELECT id, name FROM orders WHERE id > 12345 ORDER BY id ASC LIMIT 20;
避免在分页场景中进行广泛的字段排序,尽量保持排序字段与有序索引的一致性,以减小排序成本。
提升 LIMIT 查询性能的实用技巧
覆盖索引、最小化返回列与两步统计
尽量只返回需要的列,避免 SELECT *,以便索引覆盖并减少读取的数据量。 当查询列都能从一个索引中取出时,数据库可以直接通过索引完成检索和排序,提升性能。
通过覆盖索引实现分页性能提升的关键在于: 让查询的筛选、排序和返回的列都能由同一个连续的索引完成,避免回表操作。

SELECT id, name FROM products WHERE category_id = 5 ORDER BY id ASC LIMIT 20;
当需要知道总条数时,避免使用可能影响性能的 SQL_CALC_FOUND_ROWS,改用两步查询方案更可控: 先执行分页查询,再单独执行 COUNT(*) 来获取总数。
-- 分页查询
SELECT id, name FROM products WHERE category_id = 5 ORDER BY id ASC LIMIT 20;
-- 总数查询(可在应用层并行执行或单独触发)
SELECT COUNT(*) FROM products WHERE category_id = 5; 

