分页查询的思路(分页查询需要哪些参数)

lxf2023-05-11 01:26:01

bitsCN.com

以前我在mysql中使用limit 100000,20的方法分页,相信你也是这样。但是应该怎么做才能提高效率,让分页代码更高效更快捷呢?

第一部分:看分页的基本原理:

mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20 ***************** 1. row ************** id: 1 select_type: SIMPLE table: message type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 10020 Extra: 1 row in set (0.00 sec)

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

第二部分:根据雅虎几位工程师的说法,一个使用MySQL report的高效分页得到了扩展:在这篇文章中,提到了一个线索方法,提供了一些翻页的线索,比如id desc的Select * from message order,按降序每页20页,目前是第10页。当前页面最大的条目id是1020,最小的是1000。如果我们只提供跳转到上一页和下一页(不提供跳转到第n页),那么处理上一页时SQL语句可以是:

SELECT * FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;//下一页

处理下一页时,SQL语句可以是:

SELECT * FROM message WHERE id<1000 ORDER BY id DESC LIMIT 20;//上一页

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

缺点是只能提供上一页和下一页的链接形式,但是我们的产品经理非常喜欢“上一页1 2 3 4 5 6 7 8 9下一页”的链接形式。我们做什么呢

如果极限m,n是不可避免的,要优化效率,唯一的办法就是让m尽可能小。我们扩展一下前面的clue方法,或者按id desc从消息顺序中选择*,每页20页,目前是第10页,当前页最大的条目id是2519,最小的是2500。

第10页的SQL如下:

SELECT * FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20

例如,要跳到第9页,SQL语句可以写成如下形式:

SELECT * FROM tb_goods_info WHERE auto_id<2500 ORDER BY auto_id desc LIMIT 0,20

例如,要跳到第8页,SQL语句可以写成如下形式:

SELECT * FROM tb_goods_info WHERE auto_id<2500 ORDER BY auto_id desc LIMIT 20,20

例如,要跳到第7页,SQL语句可以写成如下形式:

SELECT * FROM tb_goods_info WHERE auto_id<2500 ORDER BY auto_id desc LIMIT 40,20

跳到第11页:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20

跳到第12页:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 20,20

跳到第13页:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 40,20

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

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

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

bitsCN.com

以上是mysql分页的原理和高效mysql分页查询语句_MySQL的内容。更多相关内容请关注www.AdminJS.cn(www.php.cn)!

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