MySQL分页优化

MySQL中深度分页问题的优化 MySQL中深度分页问题的优化在MySQL中,使用LIMIT子句进行分页查询时,可能会遇到一个常见的性能问题:当LIMIT子句中的偏移量X很大时,查询速度会显著下降。例如,LIMIT 0,10可能只需要20毫秒,而LIMIT 1000000,10可能需要15秒或更长时间。这个问题被称为深度分页问题。下面我们来深入探讨为什么... 阅读详情

原文链接: http://willko.iteye.com/blog/325618

mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降


1.子查询优化法
先找出第一条数据,然后大于等于这条数据的id就是要获取的数据
缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性

实验下
Sql代码
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from Member;
+----------+
| count(*) |
+----------+
| 169566 |
+----------+
1 row in set (0.00 sec)

mysql> pager grep !~-
PAGER set to 'grep !~-'

mysql> select * from Member limit 10, 100;
100 rows in set (0.00 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100;
100 rows in set (0.00 sec)

mysql> select * from Member limit 1000, 100;
100 rows in set (0.01 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100;
100 rows in set (0.00 sec)

mysql> select * from Member limit 100000, 100;
100 rows in set (0.10 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100;
100 rows in set (0.02 sec)

mysql> nopager
PAGER set to stdout


mysql> show profiles\G
*************************** 1. row ***************************
Query_ID: 1
Duration: 0.00003300
Query: select count(*) from Member

*************************** 2. row ***************************
Query_ID: 2
Duration: 0.00167000
Query: select * from Member limit 10, 100
*************************** 3. row ***************************
Query_ID: 3
Duration: 0.00112400
Query: select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100

*************************** 4. row ***************************
Query_ID: 4
Duration: 0.00263200
Query: select * from Member limit 1000, 100
*************************** 5. row ***************************
Query_ID: 5
Duration: 0.00134000
Query: select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100

*************************** 6. row ***************************
Query_ID: 6
Duration: 0.09956700
Query: select * from Member limit 100000, 100
*************************** 7. row ***************************
Query_ID: 7
Duration: 0.02447700
Query: select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100


从结果中可以得知,当偏移1000以上使用子查询法可以有效的提高性能。


2.倒排表优化法
倒排表法类似建立索引,用一张表来维护页数,然后通过高效的连接得到数据

缺点:只适合数据数固定的情况,数据不能删除,维护页表困难

具体请看,http://blog.chinaunix.net/u/29134/showart_1333566.html

3.反向查找优化法
当偏移超过一半记录数的时候,先用排序,这样偏移就反转了

缺点:order by优化比较麻烦,要增加索引,索引影响数据的修改效率,并且要知道总记录数
,偏移大于数据的一半

引用
limit偏移算法:
正向查找: (当前页 - 1) * 页长度
反向查找: 总记录 - 当前页 * 页长度


做下实验,看看性能如何

总记录数:1,628,775
每页记录数: 40
总页数:1,628,775 / 40 = 40720
中间页数:40720 / 2 = 20360

第21000页
正向查找SQL:
Sql代码
SELECT * FROM `abc` WHERE `BatchID` = 123 LIMIT 839960, 40

时间:1.8696 秒

反向查找sql:
Sql代码
SELECT * FROM `abc` WHERE `BatchID` = 123 ORDER BY InputDate DESC LIMIT 788775, 40

时间:1.8336 秒

第30000页
正向查找SQL:
Sql代码
SELECT * FROM `abc` WHERE `BatchID` = 123 LIMIT 1199960, 40

时间:2.6493 秒

反向查找sql:
Sql代码
SELECT * FROM `abc` WHERE `BatchID` = 123 ORDER BY InputDate DESC LIMIT 428775, 40

时间:1.0035 秒

注意,反向查找的结果是是降序desc的,并且InputDate是记录的插入时间,也可以用主键联合索引,但是不方便。


4.limit限制优化法
把limit偏移量限制低于某个数。。超过这个数等于没数据,我记得alibaba的dba说过他们是这样做的

5.只查索引法
http://willko.iteye.com/blog/670120

总结:limit的优化限制都比较多,所以实际情况用或者不用只能具体情况具体分析了。页数那么后,基本很少人看的。。。

别再死记硬背公式了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件) 本文详细介绍了使用Keysight ADS软件设计和仿真4GHz镜像抑制混频器的完整流程。从理论分析到实际工程实现,涵盖分支线耦合器设计、二极管建模、噪声系数仿真及性能优化等关键步骤,帮助工程师摆脱公式死记硬背,掌握实用的射频电路设计技能。附完整工程文件,可直接应用于实际项目开发。 阅读详情

相关推荐

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1639

mysql分页limit 优化

mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数据 缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性 实验下 Sql代码 mysql...

编程是技术,更是艺术。 167

CANoe从入门到精通“保姆级”教程(二)- 堪称全网“最全”系列

CANoe各功能区介绍;

车载控制器AutoSAR软件开发工程师 2万+

MySQL使用limit时如何优化_mysql分页的limit优化

1、很多新人都会很纳闷,为什么我建了索引使用分页还是这么卡。好,现在让我们一步一步去找原因吧。首先limit本身跟索引没有直接关系。先建一张商品sku表create table goods_sku(id int(10) unsigned not null auto_increment comment '自增ID',goods_id varchar(20) not null ...

weixin_35361243的博客 318

STM32HAL库学习笔记九——LCD显示

本文不会对驱动编写做特别详细的描述,以记录CubeMX的部署流程为主。

weixin_44762233的博客 6919

SAP Ariba Procurement_Catalogs

SAP Ariba Procurement_Catalogs Search Functionality PunchOut Catalogs Spot Buy catalog

CZxx1的博客 1014

MySQL深度分页优化

Mysql深度分页优化 1. 背景 mysql使用select * from table limit offset, rows分页在深度分页的情况下, 性能急剧下降。 例如:select * 的情况下直接⽤limit 600000,10 扫描的是约60万条数据,并且是需要回表 60W次,也就是说⼤部分性能都耗在随机访问上,到头来只⽤到10条数据(总共取600010条数据只留10条记录) 2. 优化 2.1 业务层面限制跨度比较大的跳页 百度和Google方案: [外链图片转存失败,源站可能有防盗链机制,

JavaMa的博客 7067

运行时安全引擎RSE

该博客重点介绍了运行时安全引擎(Runtime Security Engine,简称 RSE)与应用处理器(Application Processor,简称 AP)之间的关系。 根据 ARM 的参考设计,RSE 是位于同一芯片(die)上的一个独立核心,与 AP 和系统控制处理器(System Control Processor,简称 SCP)并列存在。RSE 为整个系统提供基本的安全保障和运行时服务,例如:可信启动(trusted boot)、度量启动(measured boot)、平台认证(platf

AI-安全-功耗 1369

mysql的分页优化_MySQL的分页优化

今天下午,帮同事重写了一个MySQL SQL语句,该SQL语句涉及两张表,其中一张表是字典表(需返回一个字段),另一张表是业务表(本身就有150个字段,需全部返回),当然,字段的个数是否合理在这里不予评价。平时,返回的数据大概5w左右,系统尚能收到数据。但12月31日那天,数据量大概20w,导致SQL执行时间过长,未能在规定的时间内反馈结果,于是系统直接报错。一般的思路是用MySQL的分页功能,即...

weixin_31499265的博客 309

2024年下半年网络规划设计师论文真题

3、深入论述自身参与的工业网络是如何实施的,为实现制造业的智能化,如何实现数据的跨系统互通,促进各种工业数据的充分流动和无缝集成以及数据安全。3、结合自身参与的网络建设,详细叙述针对该网络“去NAT”的规划和设计方案。4、在实施过程中遇到的问题以及如何处理,项目实施后的效果和评价。2、大型园区网络“去NAT”改造和业务融合的整体架构。1、“网络去NAT”对推进ipv6演进和应用的意义。4、改造过程中遇到的问题及解决方案。2、简要叙述自身参与的制造网络建设。1、网络规划在智能制造中的意义。

鹿鸣天涯 2371

基于FreeRedis实现的.NET Redis客户端缓存缓存键条件优雅过滤

在.NET开发中,使用Redis作为缓存解决方案是很常见的。FreeRedis是一个功能强大的Redis客户端库,它提供了丰富的功能和灵活性,使我们能够轻松地与Redis进行交互。在本文中,我们将探讨如何使用FreeRedis实现缓存键条件的优雅过滤,以提高缓存的效率和准确性。

RzuScala的博客 329

mysql深度分页优化方案

深度分页的优化核心在于减少MySQL扫描的数据量,避免全表扫描。通过使用索引、游标分页、延迟关联等技术,可以显著提升分页查询的性能。根据具体的业务场景选择合适的优化方案。延迟关联通过先获取主键,再关联查询实际数据的方式,减少了回表次数和I/O操作,特别适合深度分页场景。通过合理设计索引和查询语句,可以显著提升MySQL分页查询的性能。

C18298182575的博客 1911

ZYNQ 网络通信的四种实现方案

一,ZYNQ MIO以RGMII 接口连接外部PHY芯片实现LWIP网络通信。 二,ZYNQ PS 的 ENET0/ENET1 通过 EMIO 的方式扩展至 PL,在 PL 中通过 RGMII 接口连接扩展子卡实现 LWIP 网络通信。 在PL中搭建了1个AXI 1G/2.5G Ethernet Subsystem以及1个AXI Direct Memory Access IP 核。这两个 IP核均通过AXI 总线经S_AXI_HP0 口与PS 连接,PS 通过AXI 总线对其进行配置和控..

wangjie36的博客 1万+

MySQL性能调优与深度分页优化策略

在现代的Web应用和大数据环境中,MySQL作为一款广泛使用的开源关系数据库管理系统,其性能直接影响着应用程序的响应时间和用户体验。尤其是在面对海量数据的深度分页查询时,性能问题尤为突出。本文旨在探讨MySQL的性能调优策略以及深度分页查询的优化方法。MySQL性能调优是一个复杂的过程,涉及到数据库配置、查询优化、系统资源管理等多个方面。而深度分页查询的优化则需要结合具体的应用场景和数据特性,采用灵活的策略来实现高效的数据检索。通过上述的优化措施,可以显著提升MySQL在高并发和大数据环境下的表现。

小码农的博客 3857

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL分页的优化

MySQL自带的分页 LIMIT [offset,] rows 语法依据 对于MySQL自带分页方式的优化 --- 测试数据表结构 CREATE TABLE `sc` ( `sc_id` int(11) NOT NULL AUTO_INCREMENT, `s_id` int(11) NOT NULL, `c_id` int(11) NOT NULL, `score` int(1...

wujizhishui的博客 326

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

MySQL的深度分页如何优化?

MySQL的深度分页如何优化?

java1234的博客 982

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL深分页如何优化?

深度分页问题是 MySQL 分页查询中的一个常见难题,但通过合理的优化策略,我们可以有效提升查询效率。索引优化:确保排序和过滤的列上有索引。覆盖索引:减少回表操作,直接从索引中获取数据。标记分页:避免使用OFFSET,通过WHERE子句获取下一页数据。分区表:将大表分成多个分区,减少查询扫描的数据量。缓存结果:缓存分页查询结果,减少数据库负载。使用外部搜索引擎:在复杂场景下,使用 Elasticsearch 或 Solr 等工具。最后分享一份大彬精心整理的大厂面试手册,包含。

weixin_66137383的博客 978

MySQL的深度分页如何优化?

MySQL的深度分页如何优化?

java1234的博客 912

Mysql的分页优化

一、问题的引出 当MySQL表中有数据量很大的时候如何做分页? 很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询。 我们先从一个常用但性能很差的查询来看一看。 SELECT * FROM city ORDER

想作会飞的鱼的博客 461

MySQL的深度分页如何优化!

适用于大多数场景,对应用层改动较小,效果显著。关键是创建正确的覆盖索引。性能最优,无OFFSET瓶颈。需要应用层配合存储游标。将计算压力转移到后台。减少单次扫描范围。是否真的需要深度随机跳页?优化产品设计往往是性价比最高的方案。使用EXPLAIN分析查询执行计划,确认是否使用了预期的索引。选择哪种方案取决于你的具体数据量、访问模式、排序需求、实时性要求以及对应用层改动的接受程度。通常延迟关联和游标分页是解决深度分页性能问题最直接有效的武器💪。

群群的博客 1139

MySQL 深度分页优化:从原理到实践

MySQL 深度分页优化是一个综合性的问题,需要从数据库层面、代码层面以及业务层面多管齐下。通过减少回表、游标分页、借助其他技术以及业务限制等方法,可以有效提升深度分页的性能,为用户提供更流畅的体验。在实际开发中,要根据项目的具体情况选择合适的优化方案,确保系统的高效稳定运行。希望本文的内容能帮助大家在 Java 开发中更好地应对 MySQL 深度分页问题,记得关注我,获取更多实用干货知识。

m0_57836225的博客 1424

mysql 分页优化_Mysql 查询分页优化

全表扫描,速度极慢limit 语句的查询时间与起始记录的位置成正比MySQL 的 limit 语句是很方便,但是对记录很多的表并不适合直接使用创建测试表:DROP TABLE IF EXISTS `t_user`;CREATE TABLE `test`.`t_user`(`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,`username` VARCHAR...

weixin_42388631的博客 143

Mysql 深度分页查询优化

在 MySQL 中,分页是一个常见的功能,mysql在数据量大的时候,深度分页数据偏移量会增大,导致查询效率越来越低

喵小狸的博客 1186

mysql分页案例_[MySQL优化案例]系列 — 分页优化

通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询。例如下面这个SQL:SELECT * FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 100, 10;或者像下面这个不带任何条件的分页SQL:SELECT * FROM `t1` ORDER BY id DESC LIMIT 100, 10;一般而言,分页S...

weixin_39542742的博客 116

MySQL 分页查询优化

MySQL分页查询优化,通俗易懂!🎉

qq_56158663的博客 2877

MySql分页及优化

本文的核心内容:MySql的分页、百万数据分页优化、封装分页对象【参数在应用中传递】。

小草帽的博客 604
上一篇: RMI@Spring的常见问题解决
下一篇: 工作中积累的Linux命令
Model_CZ
博客等级 码龄19年 223粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值