你还在用LIMIT 1000000,10?献上分页查询优化技巧

简介: 本文详解“深分页”陷阱:`LIMIT 1000000,10`为何慢?3种优化方案(游标法、子查询定位、延迟关联)实测提速数十倍,助你零成本提升SQL性能!

我是小耶,干运营半路出家的野生DBA——写功课只是为了我踩过的坑,你们别再踩了!

刚转行时我写的分页查询是 SELECT * FROM orders ORDER BY id LIMIT 1000000, 10。前100页还好,用户翻到第200页就开始转圈。后来才知道这是典型的“深分页”问题。

先解释一个基础概念:LIMIT M, N ​到底怎么执行?
数据库拿到这个命令后,会老老实实从第一行开始扫描,扫到第 M+N 行,然后扔掉前面的 M 行,只返回最后 N 行。就像你翻一本1000页的书,要读第900页到910页,但你不能直接翻到900页,只能从第一页开始一页一页翻。M越大,翻的页数越多,越慢。

为什么很多人会踩这个坑?
因为小数据量时(比如几千行)感觉不到慢,一旦表增长到百万、千万级,LIMIT 1000000, 10 可能需要扫描上百万行,耗时几秒甚至几十秒。

优化方法一:记住上次位置(游标法)
适用于“下一页”按钮,不需要跳页。假设上一页最后一条记录的 id 是 1000000:

SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;

这就像你合上书,在1000页夹一张书签,下次直接翻到书签位置。数据库利用主键索引快速跳过,只扫描10行,速度恒定在毫秒级。
缺点​:不能跳页(比如直接点第1000页),且如果id之间有删除,每页数量可能不均匀,但通常可接受。

优化方法二:子查询先定位起始id(支持跳页)
如果用户非要跳页,可以用子查询先查出第 M 条开始的 id,再取数据:

SELECT * FROM orders 
WHERE id >= (SELECT id FROM orders ORDER BY id LIMIT 1000000, 1) 
ORDER BY id LIMIT 10;

里面的子查询 SELECT id FROM ... LIMIT 1000000,1 只查id列,而id列通常有主键索引,索引体积小,扫描速度快。拿到起始id后,外层 WHERE id>=... 的主键查询也是走索引。
实测​:500万数据,传统写法2.3秒,改后0.05秒。

优化方法三:延迟关联(当你要查所有列时特别有效)
如果必须 SELECT * 返回所有字段,可以先查主键,再关联回原表:

SELECT * FROM orders 
JOIN (SELECT id FROM orders ORDER BY id LIMIT 1000000, 10) AS tmp USING(id);

子查询只取id(索引覆盖,极快),然后通过id去原表批量取完整行。比直接 SELECT * 少了很多不必要的数据传输。

什么时候不需要优化?
数据量小(几千行)或用户几乎不走翻页,可以用简单写法。但一旦成为通用查询,建议提前优化。

【这个知识点能帮你什么?】

  • 避免因深分页导致接口超时、数据库CPU飙升。
  • 不用加额外缓存的成本,纯粹靠SQL改写就能大幅提升体验。
  • 面试或技术分享时,这是一个非常经典的优化案例,能展示你对数据库执行细节的理解。

小耶在手,SQL 不愁。

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
2月前
|
SQL 运维 关系型数据库
DBA必备技能:MySQL误删恢复完全指南(全量备份+binlog回放)
本文详解误删数据(如`DELETE FROM orders`)后的紧急恢复三步法:查Binlog→临时库回放→差异导回,并附4条血泪预防措施。不讲段子,只教能救命的操作!
|
2月前
|
SQL Java 中间件
读写分离与查询路由实战:从原理到Spring Boot代码实现
本文由“数据库小学妹”详解读写分离与查询路由实战:基于Spring Boot + 动态数据源(AbstractRoutingDataSource + AOP)实现主从库自动分流;对比ShardingSphere等中间件方案;涵盖强制读主、延迟感知、负载均衡等路由策略及避坑指南。
|
3月前
|
存储 人工智能 API
DeepSeek-V4百万上下文来了,企业数据中心准备好了吗?
DeepSeek-V4虽突破模型上限,但企业落地关键在私有化部署的“落地上限”。ZStack AIOS作为国产MaaS平台,一站式解决算力池化、异构纳管、极简部署、应用集成与安全治理难题,已支持V4全系列即装即用,助力政企高效、合规、自主地用好大模型。
|
2月前
|
安全 程序员 API
初级程序员必备的十大技能之规范编码与团队协作(二)
教程来源 http://oplhc.cn/ 本指南系统梳理代码审查(Code Review)核心实践:涵盖PR规范、多维检查清单(功能/质量/性能/安全/测试/文档)、建设性评论技巧、健康协作心态,以及README、代码注释、CHANGELOG等文档编写标准,助力团队高效交付高质量、可维护、安全的代码。
|
2月前
|
消息中间件 NoSQL 数据库
分库分表后数据不一致?3种分布式事务方案,帮你彻底解决“钱货不等”难题
本文由“数据库小学妹”详解分布式事务核心难题:分库分表后如何保障跨库数据一致性。涵盖TCC、消息队列(最终一致性)、2PC等方案对比,强调互联网场景首选“MQ+幂等+本地消息表”,并指出避坑要点(重复消费、消息丢失、悬挂问题)。
|
2月前
|
SQL 缓存 关系型数据库
主从延迟的5大“元凶”+3个排查命令,别再让从库拖后腿
数据库小学妹详解MySQL主从延迟:5大元凶(硬件弱、写压大、慢查询、网络差、大事务)+3条核心排查命令(SHOW SLAVE STATUS等),助你快速定位、精准优化,避坑生产故障!
|
3月前
|
SQL JSON 关系型数据库
慢SQL排查三板斧:SHOW PROCESSLIST + 慢查询日志 + EXPLAIN 实战
教你三招快速定位CPU 100%元凶:SHOW PROCESSLIST查活跃查询、开启慢日志+mysqldumpslow分析、EXPLAIN深度诊断SQL性能。干货不啰嗦,专治线上急症!
|
2月前
|
SQL 算法 中间件
如何让海量数据跑得更快?分库分表实战,从入门到避坑
本文深入解析MySQL分库分表核心原理与实战,结合ShardingSphere中间件,详解垂直/水平拆分策略、路由计算、SQL归并及分布式事务、全局ID、平滑扩容等避坑要点,助你突破单库瓶颈,构建高并发、海量数据下的高可用数据库架构。
|
3月前
|
存储 SQL 监控
从 OpenSearch 到阿里云 SLS:极致弹性、更低成本、生态兼容
本文围绕"让可观测更简单"展开。通过将OpenSearch数据接入SLS,在单一平台完成数据加工、查询分析、看板展示与告警,消除跨系统跳转与口径不一致。提供成本对比与落地路径,助力团队降低成本、轻化运维、加快上线,构建完整可观测闭环。
493 35
|
1月前
|
数据采集 人工智能 搜索推荐
GEO入门教程:零基础搞懂生成式引擎优化的3个关键步骤
GEO(生成式引擎优化)只需三步:①建高质量知识库(定义+数据+案例);②结构化生产(表格/FAQ/数据提升引用率80%);③多平台分发+内链,打造AI信任的内容集群。零技术门槛,7天初见成效。(239字)

热门文章

最新文章