`

高效的MySQL分页

阅读更多


 

首先看一下分页的基本原理:

mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20\G
***************** 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)

limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;

处理”下一页”的时候SQL语句可以是:

SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 20;

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

缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”<上一页 1 2 3 4 5 6 7 8 9 下一页>”这样的链接方式,怎么办呢?

如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20,20;

跳转到第13页:

SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。

注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。

已在60W数据总量的表中测试,效果非常明显。

分享到:
评论

相关推荐

    MySQL 百万级分页优化(Mysql千万级快速分页)

    MySQL 百万级分页优化(Mysql千万级快速分页),主要解决大数量级的优化

    高效的mysql分页方法及原理

    介绍了高效的mysql分页方法及原理,有需要的朋友可以参考一下

    MySQL高效分页解决方案集分享

    一,最常见MYSQL最基本的分页方式: 代码如下:select * from content order by id desc limit 0, 10在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会...

    MySQL分页分析原理及提高效率

    主要介绍了MySQL分页分析原理及提高效率的相关资料,需要的朋友可以参考下

    Mysql高效分页详解

    通常针对MySQL大数据量的查询采取“分页”策略,但是如果翻页到比较靠后的位置时查询将变得很慢,因为mysql将花费大量的时间来扫描需要丢弃的数据。 基本分页技巧 通常情况下,为了实现高效分页,需要在查询中WHERE...

    mysql分页性能探索

    常见的几种分页方式: 1.扶梯方式 扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种“更多/more”的方式,也有下拉自动加载更多的方式,在技术上都可以归纳成扶梯...

    oracle和mssql分页存储过程-均通用

    ORACLE和mssql 高效的分页存储过程,均通用,直接调用即可

    php高效获取数据分页类.zip

    介绍一个php高效获取数据分页类,PHP MYSQL数据库基本功能,获取序列ID,获取strSql第N条记录中的第N列数据,下标从1开始,获取strSql第N条记录,获取strSql记录集存入数组中。

    个人网站源码包含主页面,内容,文章,分页,使用mysql数据库,tomcat,前台代码是响应式

    通过使用MySQL,网站的数据被高效地存储和检索,确保了最佳的性能。此外,使用Tomcat确保网站安全稳定。总体而言,个人网站的源代码是一件复杂而多方面的技术,需要仔细规划和执行,以提供无缝的用户体验。

    叶子asp分页类0.12

    Descript: ASP分页类,支持access/mssql/mysql/sqlite Contact: QQ:311673 MSN:myehe@msn.com GT:mmyehe@gmail.com WebSite: http://www.yehe.org http://www.showo.com -----------------------------------------...

    Mysql 取字段值逗号第一个数据的查询语句

    从一个MySQL的例子来学习查询语句mysql分页原理和高效率的mysql分页查询语句mysql查询语句通过limit来限制查询的行数mysql优化limit查询语句的5个方法优化MySQL数据库中的查询语句详解整理MySql常用查询语句(23种)...

    MYSQL管理系统(AMS) 1.5.0107.zip

    欢迎使用 PHP MYSQL数据库管理系统-AMS-易用安全高效的MYSQL管理系统。 MYSQL管理系统(AMS) 1.5.0107 更新内容: 1、增加MySQL用户权限管理插件。 (Loc用户反馈: jumpsky) 2、提高数据查询响应速度。(CSDN用户...

    MYSQL优化详情大全

    分页查询优化:对于大数据量的分页查询,可以使用LIMIT分页,并确保使用适当的索引以提高查询速度。 避免频繁的连接和断开:频繁的连接和断开对数据库性能影响较大,可以使用连接池来管理数据库连接,减少连接开销...

    jsp人事工资管理系统(jsp+javabean+servlet+mysql).zip

    人事工资管理系统,旨在为公司提供一个高效的人事和工资管理系统,主要提供公司管理员工,管理部门,考勤,员工工资等几个功能模块。 员工模块使用分页技术实现展示员工信息,添加员工,删除员工,修改员工信息与...

    Amysql(AMS) v1.5.0107

    AMS-易用安全高效的MySQL管理系统。Amysql - AMS简介01) 高效 强大的多行SQL执行能力,支持一次执行多行SQL并多窗口完美表现各行SQL的运行结果。03) 高亮 实现版块以JS扩展形式预载,数据库列表、数据请求发送等以...

Global site tag (gtag.js) - Google Analytics