LIMIT 100000,20 慢因需扫描跳过前10万行;应改用游标分页(如WHERE id
为什么
LIMIT 100000, 20会慢得离谱因为 MySQL 在执行这类语句时,必须先扫描并跳过前 100000 行(即使不返回),再取后续 20 行。如果没走覆盖索引,还会回表查完整记录;若
ORDER BY字段无索引,甚至要额外排序临时结果集。本质是“全扫+丢弃”,不是“直接定位”。用游标分页替代
LIMIT offset, size核心思路:不依赖行号偏移,改用上一页最后一条记录的排序字段值作为查询起点。要求排序字段(如
id或created_at)有唯一性或配合其他字段构成唯一约束。示例(按自增
id降序分页):SELECT * FROM orders WHERE id < 123456 ORDER BY id DESC LIMIT 20;下一页就用刚查出的最小
id值继续缩小范围。这种方式避免了跳过大量数据,索引可高效定位起点。
- 必须有合适的索引支持,例如
INDEX (id)或INDEX (status, created_at, id)- 不能跳页(比如直接跳到第 100 页),只适合“下一页/上一页”场景
- 若排序字段非唯一(如多个记录
created_at相同),需补上主键去重:WHERE (created_at, id)延迟关联(deferred join)减少回表开销
当分页字段和查询字段不在同一索引中时,
LIMIT后仍需回表取数据,大偏移量下回表次数爆炸。延迟关联先把主键捞出来,再用主键二次查详情,让回表次数固定为LIMIT size次,而非offset + size次。示例:
SELECT t1.* FROM orders t1 INNER JOIN ( SELECT id FROM orders WHERE status = 1 ORDER BY created_at DESC LIMIT 100000, 20 ) t2 ON t1.id = t2.id;内层子查询只走索引(假设
INDEX(status, created_at, id)),外层用主键精准回查。
- 需要复合索引覆盖
WHERE条件、ORDER BY和主键(否则子查询仍可能慢)- 对
SELECT *场景效果明显;若只需几个字段,优先建覆盖索引更简单- MySQL 5.6+ 对这种写法优化较好,老版本注意检查执行计划是否走了
Using index物理分表 or 时间分区缓解单表压力
当单表超千万级且分页请求集中在最新数据时,老数据拖慢整体查询。这时靠 SQL 优化已触及瓶颈,得从结构入手。
- 按月/季度分表(如
orders_202401),查询时明确指定表名,避开历史数据扫描- 用
PARTITION BY RANGE (TO_DAYS(created_at))分区,配合WHERE created_at >= '2024-01-01'可自动裁剪分区- 注意:分表后
COUNT(*)和跨时间范围的分页会变复杂,需应用层聚合真正的大偏移量问题,往往不是 SQL 写得不够巧,而是数据模型没跟上访问模式——游标分页解决“怎么查快”,而分表/分区决定“查哪些”。
0
0
相关文章
mysql中的锁机制:行级锁与表级锁
mysql升级前需要备份哪些数据_mysql安全迁移步骤
mysql触发器在事务中如何工作_mysql并发控制说明
mysql事务提交后锁什么时候释放_mysql执行顺序解析
mysql中JOIN优化与索引应用的综合实践
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。
751
2023.10.12
SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
328
2023.10.27
在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。
350
2024.02.23
SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。
1304
2024.03.06
sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。
361
2024.03.06
运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。
881
2024.04.07
sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。
425
2024.04.29
2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。
54
2026.01.31
热门下载
相关下载
精品课程




