分页如何优化(分页实现的三种方式)

lxf2023-07-13 01:10:02

bitscn.com 在Percona Performance Conference 2009上,几位来自雅虎的工程师带来了一篇文章使用MySQL & 报告亮点很多,本文是在原文基础上的进一步延伸。

首先来看分页的基本原理:

mysql >解释SELECT * FROM message ORDER BY id desc限制10000,20/G

***************** 1.第*************

id: 1

select_type:简单

表格:消息

类型:索引

可能的关键字:空

关键:主要

key_len: 4

参考:空

行数:10020

额外:

集合中的1行(0.00秒)

Limit 10000,20表示扫描符合要求的10020行,扔掉前10000行,返回后20行。这就是问题所在。如果是极限100000,100,就需要扫描100100行。在高并发的应用中,每个查询需要扫描10W多行,性能肯定会大打折扣。还提到了limit n的性能还好,因为只扫描了n行。

本文提到了一种线索提供一些用来翻页的。线索,例如,或者选择*从消息按id排序desc,按id降序分页,每页20个条目,当前第10页,当前页的最大条目ID为9527,最小为9500。如果我们只提供上一页、下一页这样的跳转(不提供跳转到第n页),那么上一页当SQL语句可以是:

SELECT * FROM消息,其中id > 9527 ORDER BY idASC LIMIT 20

手柄下一页当SQL语句可以是:

SELECT * FROM消息,其中id < 9500 ORDER BY idDESC LIMIT 20

不管翻了多少页,每次查询只扫描20行。

缺点是只能提供上一页、下一页链接形式,但是我们产品经理很喜欢这个链接我该怎么办?

如果极限m,n是不可避免的,为了优化效率,只有使m尽可能小,我们推广前面的线索练习,或者从消息中选择*按id排序desc,按id降序分页,每页20篇文章,目前第10页,当前页最大条目ID为9527,最小为9500。例如,如果你想跳到第8页,我认为SQL语句可以这样写:

SELECT * FROM消息,其中id > 9527 ORDER BY idASC LIMIT 20,20;

跳到第13页:

SELECT * FROM消息,其中id < 9500 ORDER BY idDESC LIMIT 40,20;

原理还是一样的。记录当前页面id的最大值和最小值,并计算跳转页面和当前页面之间的相对偏移量。因为页面相似,这个偏移量不会很大,所以m的值比较小,大大减少了扫描的行数。其实传统的极限m,n的相对偏差一直是第一页,越翻到后面效率越差,上面给出的方法就没有这个问题。

注意SQL语句中的ASC和DESC。如果是ASC的结果,显示的时候记得反转。

在一个总数据为60W的表中测试过,效果非常明显。

bitsCN.com adminjs.cn是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 Adminjs.cn还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 在Adminjs.cn中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!