求求你别再用 MySQL offset 和 limit 分页了

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南) 本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。 阅读详情

来源:toutiao.com/i6860655404431442444

旁白君:主要去理解 offset 为什么会在大数据量下的查询带来性能问题?

思考完后,可以在思考下,如果分库分表,你会这么去分页呢?

不需要担心数据库性能优化问题的日子已经一去不复返了。

随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现,作为开发人员,我们要不断地打磨我们的 API,让它们提供可靠和有效的端点,从而毫不费力地浏览海量数据。

如果你做过后台开发或数据库架构,你可能是这么分页的:

如果你真的是这么分页,那么我不得不抱歉地说,你这样做是错的。

你不以为然?没关系。Slack、Shopify 和 Mixmax 这些公司都在用我们今天将要讨论的方式进行分页。

我想你很难找出一个不使用 OFFSET 和 LIMIT 进行数据库分页的人。对于简单的小型应用程序和数据量不是很大的场景,这种方式还是能够“应付”的。

如果你想从头开始构建一个可靠且高效的系统,在一开始就要把它做好。

今天我们将探讨已经被广泛使用的分页方式存在的问题,以及如何实现高性能分页。

1、OFFSET 和 LIMIT 有什么问题?

正如前面段落所说的那样,OFFSET 和 LIMIT 对于数据量少的项目来说是没有问题的。

但是,当数据库里的数据量超过服务器内存能够存储的能力,并且需要对所有数据进行分页,问题就会出现。

为了实现分页,每次收到分页请求时,数据库都需要进行低效的全表扫描。

什么是全表扫描?全表扫描 (又称顺序扫描) 就是在数据库中进行逐行扫描,顺序读取表中的每一行记录,然后检查各个列是否符合查询条件。这种扫描是已知最慢的,因为需要进行大量的磁盘 I/O,而且从磁盘到内存的传输开销也很大。

这意味着,如果你有 1 亿个用户,OFFSET 是 5 千万,那么它需要获取所有这些记录 (包括那么多根本不需要的数据),将它们放入内存,然后获取 LIMIT 指定的 20 条结果。

也就是说,为了获取一页的数据:

10万行中的第5万行到第5万零20行

需要先获取 5 万行。这么做是多么低效?

如果你不相信,可以看看这个例子:

https://www.db-fiddle.com/f/3JSpBxVgcqL3W2AzfRNCyq/1?ref=hackernoon.com

左边的 Schema SQL 将插入 10 万行数据,右边有一个性能很差的查询和一个较好的解决方案。只需单击顶部的 Run,就可以比较它们的执行时间。第一个查询的运行时间至少是第二个查询的 30 倍。

数据越多,情况就越糟。看看我对 10 万行数据进行的 PoC。

https://github.com/IvoPereira/Efficient-Pagination-SQL-PoC?ref=hackernoon.com

现在你应该知道这背后都发生了什么:OFFSET 越高,查询时间就越长。

2、替代方案

你应该这样做:

这是一种基于指针的分页。

你要在本地保存上一次接收到的主键 (通常是一个 ID) 和 LIMIT,而不是 OFFSET 和 LIMIT,那么每一次的查询可能都与此类似。

为什么?因为通过显式告知数据库最新行,数据库就确切地知道从哪里开始搜索(基于有效的索引),而不需要考虑目标范围之外的记录。

比较这个查询:

和优化的版本:

返回同样的结果,第一个查询使用了 12.80 秒,而第二个仅用了 0.01 秒。

要使用这种基于游标的分页,需要有一个惟一的序列字段 (或多个),比如惟一的整数 ID 或时间戳,但在某些特定情况下可能无法满足这个条件。

我的建议是,不管怎样都要考虑每种解决方案的优缺点,以及需要执行哪种查询。

如果需要基于大量数据做查询操作,Rick James 的文章提供了更深入的指导。

http://mysql.rjweb.org/doc.php/lists

如果我们的表没有主键,比如是具有多对多关系的表,那么就使用传统的 OFFSET/LIMIT 方式,只是这样做存在潜在的慢查询问题。我建议在需要分页的表中使用自动递增的主键,即使只是为了分页。

END
添加下方面试现场小编微信
备注:面试交流 即可进群
↓喜欢「程序员面试现场」识别下方二维码↓

关注我们吧!
「点赞」是认可★
「在看」是支持★
Python爬虫实战:全自动采集银行理财产品收益率数据 本文通过Playwright动态爬虫技术,成功实现了对银行理财产品收益率数据的实时采集,并通过 Pandas 数据清洗、SQLite 存储、调度自动化等模块,构建了一个可扩展的银行理财数据抓取系统。理财非儿戏,数据做决策。掌握银行收益信息是我们迈向理性投资的第一步。希望这套工具对你有所帮助! 阅读详情

相关推荐

IPV6基本配置

IPV6配置,DHCPV6,华为模拟器,IPV6的M/O标志位

路漫漫其修远兮 4668

22 条 API 设计最佳实践,快收藏。。

在这个微服务的世界里,后端API的一致性设计是必不可少的。 今天,我们将讨论一些可遵循的最佳实践。我们将保持简短和甜蜜——所以系好安全带,出发咯! 首先介绍一些术语 任何API设计都遵循一种叫做“面向资源设计”的原则: 资源:资源是数据的一部分,例如:用户 集合:一组资源称为集合,例如:用户列表 URL:标识资源或集合的位置,例如:/user 1. 对URL使用kebab-case(短横线小写隔开形式) 例如,如果你想要获得订单列表。 不应该: /systemOrders或/system_orders应

Java技术栈,分享最主流的Java技术 598

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1049

关于offset 和 limit 分页

本文主要去理解 offset 为什么会在大数据量下的查询带来性能问题?思考完后,可以在思考下,如果分库分表,你会这么去分页呢?不需要担心数据库性能优化问题的日子已经一去不复返了。随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现。作为开发人员,我们要不断地打磨我们的 API,让它们提供可靠和有效的端点,从而毫不费力地浏览海量数据。

weixin_52100990的博客 1674

从球谐函数到哈希编码:Instant-NGP如何重构NeRF的数学基础

本文深入解析了Instant-NGP如何通过多分辨率哈希编码重构NeRF的数学基础,显著提升训练速度和渲染效率。对比传统球谐函数,哈希编码在计算复杂度、频率适应性和内存访问效率上具有明显优势,为实时神经渲染技术开辟了新方向。

weixin_29240711的博客 420

手把手教你用YOLOv11-seg-LSCD搞定树脂件瑕疵检测(附数据集与代码)

本文详细介绍了如何使用YOLOv11-seg-LSCD模型进行工业级树脂件瑕疵检测,包括环境配置、数据集构建、模型训练与调优、部署优化等全流程。通过LSCD模块的创新设计,有效提升了气泡、裂纹等微小缺陷的检测精度,适用于各类树脂制品的质量检测场景。

weixin_28677005的博客 418

Java操作MySQL数据库 limit 实现分批分页,解决内存溢出问题

## MySQL limit 分批分页取数据库,解决运行溢出问题 ## - 在查询数据库的时候,由于要查询很大的数据,上百万的级别,往往让出现内存溢出的问题,所以这时候需要分批去取数据库表中的全部数据来进行处理,最简单的方法就是使用分页查询语句:MySQL的LIMIT语句是满足这个要求的。 - 先来了解这个用法和原理:mysql LIMIT 子句用法及原理。 - 使用查询语句的时候,经常

Agly_Charlie的博客 1万+

Android 13 GMS认证避坑:手把手教你搞定RKP配置,解决GTS测试fail

本文详细解析Android 13 GMS认证中的RKP(远程密钥配置)全流程,提供GTS测试失败的深度解决方案。从RKP核心概念到实战配置技巧,帮助开发者规避常见陷阱,确保设备顺利通过Google安全认证,特别适合需要快速掌握Android13 GMS认证的工程师参考。

weixin_29796279的博客 466

翻页新篇章:从Offset/Limit到游标分页的全面探索

在现代的Web应用中,有效的分页策略对于提升用户体验和应用性能至关重要。通过对比offset/limit分页和基于指针的分页方法,我们可以看到后者在处理大规模数据集时的明显优势。随着数据量的不断增长,基于指针的分页方法将成为更多开发者的首选。

果酱 の 博客 3794

XC7K325T FPGA硬件设计实战:从板级原理图到高速接口优化

本文以XC7K325T FPGA为核心,详细阐述了从板级原理图设计到高速接口优化的完整硬件实战流程。内容涵盖芯片管脚与电源规划、时钟复位配置电路设计,并重点解析了DDR3内存子系统以及PCIe与光纤接口等高速电路的原理图与PCB设计要点,旨在帮助工程师构建稳定可靠的高性能硬件平台。

python9snake的博客 515

44位abogus补环境与纯算逆向分析

44位ab参数补环境与纯算加密流程逆向分析

吴秋霖的博客 2792

记一次mysql分页错误(感觉自己真SB)

当数据库数据异常多的时候,取数据时使用分页是最常用的方法,但是请注意mysql数据库的分页,是从0开始的,0,0,0,(重要的事情说三遍) 例如:取表 A 按照 b字段排序,每次取 10条数据 sql的bean: @SQL("select * from A where order by b limit :1,:2") public List get(long offset,long limi

u010572774的专栏 473

基于YOLOv11的工业零件表面缺陷检测系统:从原理到实现

工业质量控制是制造业的核心环节,表面缺陷检测作为其中重要组成部分,直接关系到产品质量和企业效益。本文详细介绍了一种基于YOLOv11深度学习算法的工业零件表面缺陷检测系统,包含完整的算法原理分析、数据集构建方法、模型训练策略以及用户界面设计。通过大量实验验证,该系统能够高效准确地检测零件表面的划痕、凹陷、锈蚀等多种缺陷,检测精度达到96.2%,满足工业实时检测需求。本文还提供了完整的代码实现和详细的技术文档,为相关领域的研究者和工程师提供参考。关键词:表面缺陷检测;YOLOv11;深度学习;工业视觉;

YOLO 567

MySQL分页,求求你别再用offset和limit了!

不需要担心数据库性能优化问题的日子已经一去不复返了。随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现,作为开发人员,我们...

Python之禅的专栏 1444

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

mysql limit分页_求求你别再用offset和limit分页了

作者:码农架构I来源:toutiao.com/i6860655404431442444不需要担心数据库性能优化问题的日子已经一去不复返了。随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现,作为开发人员,我们要不断地打磨我们的 API,让它们提供可靠和有效的端点,从而毫不费力地浏览海量数据。如果你做过后台开发或数据库架构,你...

weixin_39873456的博客 108

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

求求你别再用 MySQL offset 和 limit 分页了?

来源:toutiao.com/i68606554044314424441、OFFSET 和 LIMIT 有什么问题?2、替代方案旁白君:主要去理解 offset 为什么会在大数据量下的查...

WantFlyDaCheng的博客 210

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mysql中分页查询(LIMIT和OFFSET关键字讲解)一语道破天机

mysql中分页查询(LIMIT和OFFSET关键字) 大家看图和看案例,图文并茂,比较好理解! /* 注意:mysql数据库中LIMIT分页查询时,索引是从0开始的(即表中第一条数 据的索引是0,第二条数据的索引是1,以此类推) */ #以下查询语句都可以正确执行 SELECT * FROM admin; SELECT * FROM admin LIMIT 2,50; SELECT ...

一只苟延残喘的卑微蝼蚁 3万+

MySQL的两种分页方式:Offset/Limit分页和游标分页

分页方式的选择需依据具体应用场景与性能要求。如果你的应用允许宽松的精确度或需要支持随机页面访问,Offset/Limit分页可能是不错的选择。然而对于深度分页或大数据场景,游标分页表现更为优秀,尤其是在动态数据集上避免了数据漂移问题。两者并无绝对优劣,最重要的是根据业务需求选择最适合的实现方式。

程序新视界 1868

【mysql】limit实现分页

分页 1. 使用limit实现数据的分页显示 需求1:每页显示20条记录,此时显示第1页 SELECT employee_id,last_name FROM employees LIMIT 0,20; 需求2:每页显示20条记录,此时显示第2页 SELECT employee_id,last_name FROM employees LIMIT 20,20; 需求3:每页显示20条记录,此时显示第3页 SELECT employee_id,last_name FROM employees LI

兮动人 2万+

【MySQL】LIMIT以及LIMIT OFFSET 使用方法介绍

1.LIMIT使用方法: LIMIT [参数1]--m,参数2--n; #表示从跳过m条数据开始取n行数据 #参数1为可选参数,表示跳过m条数据(默认为0),eg:1表示从第二行开始 #参数2为必选参数,表示取几行数据 eg1: SELECT * FROM table LIMIT 5; //检索前 5 个记录行 等价于 SELECT * FROM table LIMIT 0,5; ...

Asher117的博客 1万+

分页LIMIT和OFFSET关键字

1. 分页LIMIT和OFFSET关键字 LIMIT # 索引从0开始 0即是ID:1 从第5条数据开始取1条数据 # 即结果集ID为5 SELECT * FROM pms_product LIMIT 4,1; OFFSET #索引从0开始 0即是ID:1 从第1条数据开始取4条数据 # **即结果集****ID****为****[****2****,****3****,****4****,****5****]** SELECT * FROM pms_product LIMIT 4 OFFSET 1

qq_41935174的博客 2543

MySQL分页查询--LIMIT、OFFSET

MySQL分页查询如何实现?LIMIT\OFFSET如何使用?使用LIMIT\OFFSET会出现哪些问题?深分页问题如何解决?

qq_63730529的博客 3675

MySQL 的分页查询优化:游标分页 vs LIMIT OFFSET

在 Web 应用中,分页查询是非常常见的需求,如 **文章列表、商品列表、用户评论** 等。当数据量较小时,`LIMIT OFFSET` 分页方案可以正常工作,但当数据量**上百万甚至上亿**时,`LIMIT OFFSET` 可能会导致 **性能下降**,查询速度变慢。本篇文章将介绍 **分页查询的常见方案**,分析 **`LIMIT OFFSET` 的性能问题**,并提供 **游标分页优化方案**,帮助开发者提升 MySQL 查询性能。

1809

LIMIT和OFFSET的高性能分页优化逻辑

数据库应用常见功能之一就是分页,尤其是当数据量很大的时候,应用性能的高低,一定程度上和分页逻辑的效率紧密相关。GreatSQL技术社区的这篇文章《LIMIT和OFFSET分页性能差!今天来介绍如何高性能分页》,讲解了LIMIT查询效率问题和优化改进建议,内容不很复杂,但却非常实用,值得借鉴学习。前言LIMIT和OFFSET有什么问题初探LIMIT查询效率数据准备开始测试分析耗时的原因优化再优化总结...

bisal的专栏 2942
上一篇: 鸿蒙OS 2.0流畅度实测,真的比安卓差吗?
下一篇: Intellij IDEA 这样配置注释模板,让你瞬间高出一个逼格!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值