MySQL 中的LIMIT语句
LIMIT
语句用于 限制查询返回的行数 ,常用于分页查询或取部分数据,提高查询效率。
1.LIMIT语法
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件
ORDER BY 排序字段
LIMIT 记录数 OFFSET 偏移量;
或:
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件
ORDER BY 排序字段
LIMIT 偏移量, 记录数;
📌
LIMIT 偏移量, 记录数和LIMIT 记录数 OFFSET 偏移量作用相同
。
2.LIMIT基本用法
(1) 获取前 N 行数据
SELECT * FROM users LIMIT 5;
返回表
users
的前 5 行数据 。
(2)LIMIT结合ORDER BY
如果
不排序
,返回的数据可能
不稳定
(顺序不确定)。
SELECT * FROM users ORDER BY age DESC LIMIT 5;
先按
age
降序排序 ,再取前 5 行数据。
(3)LIMIT进行分页查询
如果要获取
第 11 到 20 条记录
:
SELECT * FROM users ORDER BY id ASC LIMIT 10 OFFSET 10;
或:
SELECT * FROM users ORDER BY id ASC LIMIT 10, 10;
📌
等效于LIMIT 10 OFFSET 10,其中
:
10
是 偏移量(OFFSET) ,表示跳过前 10 条数据。
10
是 返回的行数(LIMIT) 。
📌 分页查询公式 :
LIMIT 每页条数 OFFSET (当前页 - 1) * 每页条数;
例如: 第 1 页(前 10 条):
LIMIT 10 OFFSET 0
第 2 页(第 11-20 条):
LIMIT 10 OFFSET 10
第 3 页(第 21-30 条):
LIMIT 10 OFFSET 20
3.LIMIT结合COUNT()
(1) 统计总记录数
分页时,通常要先获取总记录数:
SELECT COUNT(*) FROM users;
📌
COUNT(\*)更快,不会忽略NULL
。
4.LIMIT结合RAND()(随机取数据)
如果想要
随机返回 3 条记录
:
SELECT * FROM users ORDER BY RAND() LIMIT 3;
📌 ⚠ 注意 :
ORDER BY RAND()
性能较低 ,会对所有数据进行排序再取值。
更高效的随机查询(适用于
id
递增的数据表):
SELECT * FROM users
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM users)))
LIMIT 3;
5.LIMIT语句的性能优化
(1)LIMIT OFFSET可能导致性能下降
当
OFFSET
很大时:
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 100000;
MySQL 仍然会扫描 100000 行 ,然后丢弃前 100000 条数据,只返回 10 条, 影响性能 。
优化方法:用索引加条件替代OFFSET
SELECT * FROM users WHERE id > 100000 ORDER BY id LIMIT 10;
📌
适用于id是自增主键的情况,查询速度更快
。
(2)LIMIT结合JOIN可能引发性能问题
SELECT * FROM users
JOIN orders ON users.id = orders.user_id
ORDER BY users.id LIMIT 100000, 10;
📌
如果users.id没有索引,查询会很慢
。
优化方法 :
SELECT users.* FROM users
WHERE users.id > (SELECT id FROM users ORDER BY id LIMIT 100000, 1)
ORDER BY users.id LIMIT 10;
先 找到偏移的起点 ,再
LIMIT
取值, 减少扫描行数 。
6.LIMIT结合GROUP BY
如果要
获取每个城市的前 3 名用户
:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY city ORDER BY age DESC) AS rank
FROM users
) AS temp WHERE rank <= 3;
📌
ROW_NUMBER()需要 MySQL 8.0+ 才支持
。
7.LIMIT结合DISTINCT
如果要
获取唯一数据的前 5 条
:
SELECT DISTINCT city FROM users LIMIT 5;
📌
LIMIT在DISTINCT之后生效
,只返回 5 个唯一的
city
。
8.LIMIT语句总结
用法语法示例说明
获取前 N 行LIMIT 5取前 5 条数据分页查询LIMIT 10 OFFSET 10取第 11-20 条数据随机取 N 条ORDER BY RAND() LIMIT 3随机返回 3 条数据统计总数SELECT COUNT(*) FROM users;获取总记录数优化大偏移WHERE id > (SELECT id FROM users LIMIT 100000, 1) LIMIT 10;避免OFFSET性能问题
🔥 重点总结
LIMIT
限制查询返回的 行数 ,用于分页或取部分数据。
LIMIT 偏移量, 行数
等价于
LIMIT 行数 OFFSET 偏移量
。
ORDER BY
+LIMIT
确保数据顺序稳定
。
ORDER BY RAND()
效率低 ,大数据表建议用 更优化的随机查询 。
大OFFSET查询效率低
,建议用索引优化查询。
这样,你的
LIMIT
查询就会更快、更高效!
🚀
