结论:使用LIMIT时要避免低偏移量大页码查询,如LIMIT 10000,10直接用子查询优化:SELECT * FROM table WHERE id > (SELECT id FROM table ORDER BY id LIMIT 10000) ORDER BY id LIMIT 10;结合索引、避免SELECT *、合理分页是提升效率的关键技巧,网友强烈推荐!
来源1
在使用LIMIT分页查询时,千万不要使用大偏移量。比如:select * from table limit 10000,10; 这种语句是先从第1行开始扫描,然后丢弃前10000行数据,再取10条。这种操作在数据量大的情况下非常耗时。 优化方案:select * from table where id > 10000 order by id limit 10;
来源2
LIMIT 配合 ORDER BY 使用时,确保 ORDER BY 的字段有索引,否则 LIMIT 效果很差。 比如:SELECT * FROM users ORDER BY create_time DESC LIMIT 10; 如果 create_time 没有索引,全表排序很慢。 加索引:ALTER TABLE users ADD INDEX idx_create_time (create_time);
来源3
分页查询优化经典技巧:使用覆盖索引避免回表。 SELECT id,name FROM users ORDER BY id LIMIT 100,10; 如果 id 和 name 都在索引中,就不会回表查询,大大提升速度。
来源4
深分页问题解决:SELECT * FROM (SELECT * FROM table ORDER BY id LIMIT 20000) t LIMIT 10; 但 MySQL 8.0+ 支持窗口函数:SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY id) rn FROM table) t WHERE rn BETWEEN 10001 AND 10010;
来源5
注意:LIMIT 0,10 和 LIMIT 10 效果相同,都是取前10条。LIMIT 10,10 是从第11条开始取10条。永远不要用 OFFSET 很大的值!
来源6
联合索引优化 LIMIT:建 (a,b) 联合索引,SELECT * FROM table WHERE a=1 ORDER BY b LIMIT 10; 就能走索引扫描,速度飞起。
FAQ
Q: LIMIT 和 TOP 有什么区别?
A: LIMIT 是 MySQL/PostgreSQL 语法,TOP 是 SQL Server 语法,功能类似。
Q: 大表分页为什么慢?
A: 因为 OFFSET 大时需要扫描并丢弃大量行,用基于主键的游标分页代替。
Q: LIMIT 能用在 UPDATE/DELETE 上吗?
A: 可以,如 UPDATE table SET status=1 LIMIT 100; 安全批量更新。
Q: 如何监控 LIMIT 查询性能?
A: 用 EXPLAIN 查看 type=ALL 或 rows 很大,就是问题,用慢查询日志分析。