当前位置: 首页 > article >正文

如何优化 MySQL 千万级数据分页查询的性能?

它的本质是**传统LIMIT offset, size在大数据量下性能急剧下降是因为 MySQL 必须扫描并丢弃前offset行数据。当offset很大时如LIMIT 1000000, 10MySQL 需要读取 1,000,010 行记录执行 1,000,010 次回表 (Row Lookup)操作最后只返回 10 行。这是一种O(N) 的线性扫描浪费。核心痛点“回表”。二级索引找到主键后必须去聚簇索引主键索引中查找完整行数据。Offset 越大无效的回表次数越多。优化目标减少回表次数或者避免扫描无效数据。核心逻辑别让 MySQL 做无用功。要么让它只查主键覆盖索引要么让它记住上次的位置游标/Seek Method要么让它去搜索引擎干这活。如果把分页比作在图书馆找书传统分页 (LIMIT 1000000, 10)图书管理员从第 1 本书开始数数到第 1,000,000 本然后把接下来的 10 本拿给你。代价管理员累得半死你只拿了 10 本。前面的 999,990 次计数都是浪费。覆盖索引优化管理员只看目录卡片二级索引找到第 1,000,000 个卡片的 ISBN主键然后直接去书架取这 10 本书。代价虽然还要去书架但不用翻阅每一本书的内容只在目录上快速定位。游标分页 (Seek Method)你告诉管理员“我上次看到的是 ISBN 为978-7-111的书。”管理员直接在目录中找到 978-7-111的第一本书拿接下来 10 本。代价极速。无需计数直接定位。搜索引擎 (Elasticsearch)图书馆太大专门建了一个电子检索系统。所有复杂查询和深分页都交给它。代价架构复杂度增加数据同步延迟。一、传统分页瓶颈为什么LIMIT慢1. 执行流程分析SELECT*FROMordersORDERBYcreate_timeDESCLIMIT1000000,10;排序如果create_time有索引利用索引有序性否则文件排序 (Filesort)。定位沿着索引树找到第 1,000,001 条记录的主键 ID。回表 (Key Lookup)拿着这 1,000,010 个主键 ID去聚簇索引中查找完整的行数据SELECT *。过滤丢弃前 1,000,000 行返回最后 10 行。2. 性能杀手随机 I/O回表操作通常是随机磁盘 I/O比顺序 I/O 慢几个数量级。CPU 浪费解析、组装、丢弃大量不需要的数据。Buffer Pool 污染大量无关数据页被加载到内存挤占热点数据空间。 核心洞察LIMIT的本质是“跳过”。跳过的越多浪费越大。优化的核心是“不跳过”或者“少回表”。二、三大优化方案SQL 层面的手术方案 1覆盖索引 子查询 (Late Row Lookups)原理先在二级索引中完成“跳过”和“限制”只拿到主键 ID然后再关联原表获取完整数据。将1,000,010 次回表减少为10 次回表。SQL 改写-- 原始慢查询SELECT*FROMordersORDERBYcreate_timeDESCLIMIT1000000,10;-- 优化后SELECTo.*FROMorders oINNERJOIN(-- 子查询只查主键利用覆盖索引不回表SELECTidFROMordersORDERBYcreate_timeDESCLIMIT1000000,10)AStmpONo.idtmp.id;前提条件create_time必须有索引。子查询(SELECT id ...)必须是覆盖索引即索引中包含id和create_time不需要回表。InnoDB 二级索引默认包含主键所以通常天然满足。效果子查询极快只在索引树上遍历。主查询通过主键精确查找 10 次Efficient Point Queries。性能提升10-100 倍。方案 2游标分页 / Seek Method (基于 ID 或唯一键)原理放弃OFFSET改用上一页最后一条记录的 ID作为起点。利用索引的范围扫描 (或)直接定位无需扫描前 N 条。SQL 改写-- 第一页SELECT*FROMordersORDERBYidDESCLIMIT10;-- 假设最后一条 ID 是 990-- 第二页 (传入 last_id 990)SELECT*FROMordersWHEREid990ORDERBYidDESCLIMIT10;-- 第三页 (传入新的 last_id)SELECT*FROMordersWHEREid980ORDERBYidDESCLIMIT10;优势时间复杂度 O(1)相对于 Offset 的 O(N)。无论翻到第几页速度几乎不变。完全避免扫描无效数据。劣势只能顺序翻页不能直接跳转到第 1000 页除非你知道第 999 页的最后一个 ID。适用场景移动端无限滚动 (Infinite Scroll)、日志查看、后台列表通常用户只关心最新或上一页。注意如果排序字段不是唯一键如create_time可能有重复需使用复合游标WHERE(create_time,id)(2023-01-01,100)ORDERBYcreate_timeDESC,idDESCLIMIT10;方案 3限制最大页数 (Business Constraint)原理从产品层面解决技术问题。Google 搜索也只展示前几页。策略禁止访问超过第 100 页的数据。SQL$pagemin($request-page,100);// 强制上限$offset($page-1)*$pageSize;价值绝大多数用户不会翻到 100 页以后。为极少数长尾需求牺牲整体性能是不划算的。三、架构级解决方案当 SQL 优化不够时1. 引入 Elasticsearch (ES) / Solr场景复杂筛选、模糊搜索、深度分页10,000 页。原理ES 使用倒排索引和Scroll/Search AfterAPI专为大规模数据检索设计。架构MySQL作为Source of Truth存储完整数据。ES作为Search Engine同步 MySQL 数据通过 Canal, Logstash, 或业务代码双写。查询流程前端请求 - ES 搜索 - 返回 ID 列表 - (可选) 回 MySQL 查详情。优势支持任意字段的复杂组合查询深分页性能远超 MySQL。2. 冗余统计表 / 预计算场景需要精确的总行数 (COUNT(*))这在千万级表中很慢。策略维护一个order_count_stat表实时或定时更新总数。前端显示“共 1000 万条”但不允许翻到最后几页。价值避免每次分页都执行昂贵的COUNT(*)。3. 冷热数据分离场景大部分查询集中在最近 3 个月的数据。策略热数据最近 3 个月存放在高性能 SSD / MySQL 主库。冷数据3 个月前归档到 HDD / 历史库 / Hive。分页查询默认只查热数据表。价值减小单表数据量提升索引效率。四、认知牢笼常见误区1. 误区“加索引就能解决所有分页问题。”真相索引能加速排序和定位但无法消除大 Offset 带来的回表开销。对策必须结合覆盖索引或游标分页。2. 误区“SELECT COUNT(*)很快。”真相在 InnoDB 中COUNT(*)需要扫描全表或最大的二级索引千万级数据可能需要几秒。对策使用近似值SHOW TABLE STATUS或冗余计数表。3. 误区“游标分页用户体验不好因为不能跳页。”真相在移动互联网时代无限滚动是主流。即使是在 PC 端用户也很少直接输入“第 5000 页”。对策如果必须跳页限制最大页码如 100 页内部使用传统分页超过 100 页提示“请细化搜索条件”。4. 误区“ES 是银弹可以完全替代 MySQL 查询。”真相ES 存在数据一致性延迟近实时 NRT。ES 不适合事务性操作和复杂聚合。对策MySQL 和 ES 各司其职。MySQL 存数据ES 搜数据。5. 误区“优化分页只需要改 SQL。”真相有时候产品需求才是瓶颈。对策与产品经理沟通确认“深分页”是否真的是刚需。很多时候导出功能或特定时间范围筛选更能解决问题。 总结原子化“千万级分页优化”全景图维度关键点本质减少无效扫描和回表开销核心瓶颈大 Offset 导致的线性扫描和随机 I/OSQL 优化覆盖索引子查询 (Late Lookup)、游标分页 (Seek Method)架构优化Elasticsearch、冷热分离、限制最大页数最佳实践优先游标分页其次覆盖索引最后考虑 ESPHP 隐喻Don’t Count to a Million. Jump to the Page Number.公式Performance (Index_Coverage × Seek_Method) ^ Data_Architecture终极心法分页优化的本质是“对扫描的零容忍”。别让数据库做无用功。能定位的绝不扫描能少回表的绝不多回。于索引中见捷径于游标见极速以架构为尺解全表之牛于海量数据中求精准之真。行动指令审计慢查询找出项目中OFFSET大于 1000 的分页查询。实施覆盖索引将SELECT *改写为JOIN (SELECT id ...)子查询模式。改造前端对于列表页尝试改为“加载更多”或“无限滚动”后端改用游标分页 (WHERE id last_id)。限制页码在后端代码中强制$page 100。评估 ES如果业务涉及复杂搜索和深分页规划引入 Elasticsearch。思维升级记住最好的分页是让用户不需要翻到第 1000 页。

相关文章:

如何优化 MySQL 千万级数据分页查询的性能?

它的本质是:**传统 LIMIT offset, size 在大数据量下性能急剧下降,是因为 MySQL 必须 扫描并丢弃 前 offset 行数据。当 offset 很大时(如 LIMIT 1000000, 10),MySQL 需要读取 1,000,010 行记录,执行 1,000…...

3PEAK思瑞浦 TPA6531-S5TR SOT23-5 运算放大器

特性 供电电压:1.75V至5.5V 偏移电压:1.5mV(最大值) 最大可调工作频率:300kHz,斜率:0.15V/us 轨到轨输入和输出 0.1赫兹至10赫兹电压噪声:1伏峰值 开关电源时无显著输出抖动 低功耗:每通道最大25安培 工作温度范围:-40C至125C...

昇腾NPU模型服务化——从离线模型到高可用推理服务

模型训练完只是第一步。真正产生业务价值的是把模型部署成724小时在线服务——毫秒级延迟、支持动态Batching、能扛住流量洪峰,且具备高可用性。 这篇将手把手教你基于昇腾NPU构建生产级模型推理服务,涵盖框架选型、服务化架构、动态Batching优化、热加载…...

XXPermissions:Android权限管理框架的架构设计与最佳实践

XXPermissions:Android权限管理框架的架构设计与最佳实践 【免费下载链接】XXPermissions Android Permissions Framework, Adapt to Android 16 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android应用开发中,权限管理一…...

CMSIS-DAP调试器原理与应用:以Elektor mbed interface为例

1. 项目概述:Elektor mbed interface [150554] 是什么?如果你玩过ARM Cortex-M系列的单片机,尤其是NXP LPC800系列,那你可能对“CMSIS-DAP”这个调试器标准不陌生。它是由ARM官方推出的一个开源调试接口标准,最大的好处…...

收藏|2026年AI大模型就业爆发!岗位暴涨12倍、月薪6W+,小白零基础入门指南

2026年,AI已从“科技热点”彻底变为职场“刚需赛道”!脉脉高聘人才智库最新发布的《2026年1-2月中高端人才求职招聘洞察》,用硬核数据揭示行业真相:AI人才成招聘市场顶流,岗位量、薪资双双爆发式增长。尤其对零基础小白…...

终极解决方案:Windows Cleaner免费开源工具,3步彻底解决C盘爆红问题

终极解决方案:Windows Cleaner免费开源工具,3步彻底解决C盘爆红问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否也经历过这样的…...

终极STL到STEP转换指南:如何实现3D打印模型到CAD设计的无缝衔接

终极STL到STEP转换指南:如何实现3D打印模型到CAD设计的无缝衔接 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在数字化制造和工程设计领域,STL到STEP转换已成为连接3D…...

收藏|2026年大模型算法岗崛起!程序员小白入门高薪赛道全攻略

前些年,算法岗位一直稳居技术圈高薪行列,无数程序员争相入局,也成为计算机专业毕业生求职首选方向。 伴随大模型技术飞速迭代落地,行业就业格局迎来重大变革。如今含金量最高、人才缺口最大、长期发展潜力顶尖的岗位,已…...

WarcraftHelper:让魔兽争霸3在现代电脑上完美运行的关键插件

WarcraftHelper:让魔兽争霸3在现代电脑上完美运行的关键插件 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为《魔兽争霸3》这…...

基于Meshtastic构建LoRa Mesh网络:从硬件自制到传感器集成实战

1. 项目概述:构建一个灵活且易用的LoRa Mesh网络 如果你对物联网、远程传感或者去中心化通信网络感兴趣,那么LoRa技术一定不会陌生。它以其超低功耗、超远距离和强大的抗干扰能力,成为了构建广域传感网络的理想选择。然而,传统的…...

Python-for-Android 完整指南:5分钟将Python应用打包为Android APK

Python-for-Android 完整指南:5分钟将Python应用打包为Android APK 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python-for-Android&#xff0…...

UE5项目打包后RenderTarget导出图片全黑?手把手教你解决伽马校正与资产打包问题

UE5打包后RenderTarget导出图片全黑的终极解决方案当你花了整整三天时间调试RenderTarget导出功能,终于在编辑器里看到完美的截图效果,却在打包成可执行文件后发现所有导出的图片都变成了一片漆黑——这种从云端跌入谷底的感觉,每个UE开发者都…...

基于Atmega 1284P的16位复古计算器:硬件设计与软件实现全解析

1. 项目概述与核心思路最近在整理工作室时,翻出了一堆老旧的7段数码管和矩阵键盘,看着这些充满复古气息的元件,一个想法冒了出来:为什么不自己动手做一台复古风格的计算器呢?不是那种用液晶屏显示的现代计算器&#xf…...

树莓派Zero离线语音交互实战:TTS与STT引擎部署与优化

1. 项目概述:为什么选择树莓派 Zero 来实现语音功能?如果你玩过 Arduino、ESP32 这类微控制器,也接触过树莓派 4B 这样的单板电脑,那你大概能理解那种“选择困难症”:微控制器实时性强、功耗低,但算力有限&…...

理想二极管控制器:用MOSFET实现毫伏级压降的电源管理方案

1. 理想二极管控制器:告别传统二极管的压降损耗 在电源设计、电池保护、太阳能板并联这些领域里,二极管是个再常见不过的元件。我们用它来防反接、做整流、实现“或”逻辑供电,几乎不假思索。但如果你设计过一个需要处理大电流、低电压的系统…...

开源三角洲机器人Delta-Robot One:从入门到精通的创客实践指南

1. 项目概述:一个为学习而生的开源三角洲机器人如果你对机器人感兴趣,但又觉得它高深莫测、无从下手,那么Delta-Robot One(我们亲切地称它为“One”)可能就是为你量身打造的入门项目。这不是一个遥不可及的工业设备&am…...

基于晶体管逻辑的水箱自动控制器设计与实现

1. 项目概述:一个基于晶体管逻辑的自动水箱/湿度灌溉控制器 如果你也像我一样,曾经为家里的花园、阳台植物或者农村老家的储水塔手动开关水泵而烦恼,那么这个项目就是为你准备的。我设计并制作了一个完全自动化的水箱水位控制器,它…...

避坑指南:Unity中AABB碰撞检测失效的5种常见原因及解决方法

Unity中AABB碰撞检测失效的深度排查与解决方案在Unity开发中,AABB(轴对齐包围盒)碰撞检测是基础但容易出问题的环节。许多开发者都遇到过这样的情况:明明逻辑正确,测试时却出现物体穿透、碰撞时有时无等诡异现象。本文…...

观察Token消耗明细,Taotoken用量看板如何帮助控制预算

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Token消耗明细,Taotoken用量看板如何帮助控制预算 对于个人开发者或项目管理者而言,在使用大模型API时…...

taotoken用量看板如何帮助团队精细化管理api调用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 taotoken用量看板如何帮助团队精细化管理api调用成本 对于团队管理者而言,将大模型能力集成到产品开发或业务流程中&am…...

ZYNQ中断避坑指南:PL端信号线如何正确‘连线’到PS端处理函数?

ZYNQ中断系统深度解析:从硬件信号到软件响应的全链路实践 在嵌入式系统开发中,中断处理是实时响应的核心机制。对于ZYNQ这种集成了ARM处理器(PS)和可编程逻辑(PL)的异构计算平台,其中断系统既有传统处理器的特性,又具备FPGA灵活定…...

基于Arduino UNO的真随机数生成与数据持久化在Tambola游戏机中的应用

1. 项目概述:用Arduino UNO打造一台全自动Tambola游戏机如果你玩过或者听说过Tambola(在印度非常流行的游戏,在欧美也叫Bingo或Housie),就知道它的核心玩法是主持人从一个装有数字球的容器中随机抽取号码,玩…...

基于EMA与轻量级机器学习的Wi-Fi链路质量预测实战

1. 项目概述与核心价值在工业自动化、仓储物流和智能制造等场景里,无线网络的稳定性正变得前所未有的重要。想象一下,一个自动导引运输车(AGV)正在执行物料搬运任务,或者一个机械臂正在与中央控制系统进行实时数据同步…...

API渗透测试:契约驱动的协议/语义/架构三层攻防

1. 为什么“API渗透测试”不是Web渗透的简单延伸?很多人刚接触API安全时,第一反应是:“不就是把Burp Suite抓到的HTTP请求换个参数发一发?跟测网页表单差不多。”我2018年第一次接手某金融类SaaS平台的API安全评估时,也…...

Metabase:零代码 BI 数据可视化工具,自建数据看板

Metabase:零代码 BI 数据可视化工具,自建数据看板 在数据驱动决策的时代,能快速看到业务数据的变化趋势至关重要。然而,专业 BI 工具(如 Tableau、Power BI)价格昂贵,而让每个业务同学都学 SQL …...

Taotoken的稳定性与低延迟在实时对话应用中的实际体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken的稳定性与低延迟在实时对话应用中的实际体验 在开发需要快速响应的AI聊天应用时,后端API的稳定性和延迟表现是…...

京东自动购物终极指南:告别缺货烦恼,智能抢购神器

京东自动购物终极指南:告别缺货烦恼,智能抢购神器 【免费下载链接】Jd-Auto-Shopping 京东商品补货监控及自动下单 项目地址: https://gitcode.com/gh_mirrors/jd/Jd-Auto-Shopping 还在为心仪商品瞬间售罄而苦恼吗?还在熬夜等待补货却…...

反向海淘站点常见配置故障复盘与数据一致性优化方案

摘要反向海淘独立站运行过程中,容易出现价格换算异常、页面语种错乱、商品同步失败、订单状态停滞、运费计算偏差等问题。多数故障并非系统底层缺陷,而是配置逻辑理解偏差、数据规范不统一引发。本文结合实际运维场景,汇总高频故障成因&#…...

告别KITTI!用TartanAir数据集在Unreal Engine+AirSim里复现那些让VSLAM算法“翻车”的雨天和黑夜

超越KITTI:用TartanAir数据集在虚拟极端环境中锤炼VSLAM算法当视觉SLAM算法在KITTI数据集上取得95%的准确率时,开发者们常常会松一口气——直到这些算法被部署到真实世界的雨夜街道上。突然之间,那些在阳光明媚的德国道路上表现优异的特征点检…...