LIMIT用于控制查询返回的记录数,主要用法为LIMIT count和LIMIT offset, count;常与ORDER BY结合实现分页、获取最新/最旧或最高/最低的N条数据,但需注意大偏移量性能问题及排序字段无索引导致的文件排序开销,优化时可采用基于ID的增量查询、覆盖索引、避免SELECT *和SQL_CALC_FOUND_ROWS等策略。

MySQL的
LIMIT
在MySQL里,
LIMIT
LIMIT count
count
比如,我想看看我的用户表里,最前面注册的5个用户是谁:
SELECT id, username, email FROM users LIMIT 5;
但更多时候,我们不只是想看最前面几条,我们可能需要“跳过”一部分,再取一部分。这时候就用到
LIMIT offset, count
offset
count
LIMIT 0, 10
LIMIT 10
LIMIT 10, 10
这在做分页的时候特别有用。比如说,我要看第二页的数据,每页显示10条:
SELECT id, username, registration_date FROM users ORDER BY registration_date DESC LIMIT 10, 10;
这里我特意加了
ORDER BY
LIMIT
ORDER BY
LIMIT
谈到分页,
LIMIT offset, count
LIMIT 100000, 10
针对这种大偏移量分页的性能问题,我通常会考虑几种优化策略。一种非常有效的方式是基于上次查询的ID进行优化。如果我们有一个自增的主键(或任何有序且唯一的列),并且用户总是按顺序翻页,那么我们完全可以避免使用大的
offset
比如,第一页的最后一条记录的ID是
last_id
SELECT id, title, created_at FROM articles WHERE id > [last_id_from_previous_page] ORDER BY id ASC LIMIT 10;
这种方式,数据库只需要定位到
last_id
-- 假设我们按 created_at 降序排序,要获取第100000条之后的10条
SELECT a.id, a.title, a.created_at
FROM articles a
INNER JOIN (
SELECT id
FROM articles
ORDER BY created_at DESC, id DESC -- 确保唯一排序
LIMIT 100000, 10 -- 找出要取的这10条记录的id
) AS sub
ON a.id = sub.id
ORDER BY a.created_at DESC, a.id DESC;这种子查询的方式,先用
LIMIT
LIMIT
ORDER BY
前面也提到了,
LIMIT
ORDER BY
ORDER BY
LIMIT
那么,它们结合起来,最常见的场景有哪些呢?
获取“最新”或“最旧”的N条记录:这是最普遍的。比如,博客首页展示最新发布的5篇文章,或者论坛里最新回复的10个帖子。
-- 获取最新发布的5篇文章 SELECT id, title, publish_date FROM posts ORDER BY publish_date DESC LIMIT 5; -- 获取最旧的3个用户(假设注册日期越早越旧) SELECT id, username, registration_date FROM users ORDER BY registration_date ASC LIMIT 3;
获取“最高”或“最低”的N个值:比如,销售额最高的10个产品,或者考试成绩最低的5名学生。
-- 获取销售额最高的10个产品 SELECT product_name, sales_amount FROM products ORDER BY sales_amount DESC LIMIT 10; -- 获取平均分最低的5名学生 SELECT student_name, average_score FROM students ORDER BY average_score ASC LIMIT 5;
随机获取N条记录:虽然效率不高,但在某些场景下,比如抽奖或者显示随机推荐内容,会用到
ORDER BY RAND() LIMIT N
-- 随机获取3个推荐商品 SELECT product_name, description FROM products ORDER BY RAND() LIMIT 3;
需要注意的是,
ORDER BY RAND()
RAND()
LIMIT offset, 1
WHERE id IN (...)
LIMIT
LIMIT
一个常见的陷阱是,当
ORDER BY
LIMIT
text
ORDER BY
LIMIT 1
优化建议:
为ORDER BY
WHERE
WHERE condition ORDER BY field LIMIT N
field
INDEX(condition_field, order_field)
*避免`SELECT `:尤其是在子查询或需要进行排序的查询中。只选择你真正需要的列,可以减少数据传输量和内存消耗,有时还能利用到覆盖索引**(covering index),即查询所需的所有列都在索引中,这样MySQL就不需要回表查询数据行了。
谨慎使用SQL_CALC_FOUND_ROWS
LIMIT
LIMIT
COUNT(*)
SQL_CALC_FOUND_ROWS
-- 不推荐,可能影响 LIMIT 性能 SELECT SQL_CALC_FOUND_ROWS id, title FROM posts ORDER BY publish_date DESC LIMIT 10; SELECT FOUND_ROWS(); -- 推荐,通常更快 SELECT id, title FROM posts ORDER BY publish_date DESC LIMIT 10; SELECT COUNT(*) FROM posts;
考虑STRAIGHT_JOIN
STRAIGHT_JOIN
LIMIT
理解LIMIT
LIMIT
LIMIT
总而言之,
LIMIT
ORDER BY
WHERE
以上就是mysql中limit语句如何限制结果条数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号