`

高效的MySQL分页

阅读更多
PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using 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数据总量的表中测试,效果非常明显。
分享到:
评论

相关推荐

    winform mysql 分页

    在.NET开发环境中,WinForm是一种常用的桌面应用程序框架,而MySQL则是一种广泛使用的开源关系型数据库...通过这些步骤,你可以构建一个功能完善的WinForm应用程序,以高效且用户友好的方式处理大量的MySQL数据库数据。

    JSP+MySql分页组件

    【JSP+MySQL分页组件】是Web开发中常见的功能,用于处理大量数据时提高页面加载速度和用户体验。在Web应用程序中,一次性加载所有数据可能导致页面响应慢,尤其是在数据库存储的数据量庞大的情况下。分页技术可以...

    asp mysql分页(超完美版本)

    ### ASP与MySQL分页技术详解 #### 一、引言 在Web开发中,当数据量庞大时,一次性展示所有数据不仅会导致页面加载缓慢,还会严重影响用户体验。因此,实现数据的分页显示变得尤为重要。本文将详细介绍如何在ASP...

    PHP MYSQL分页代码

    本资源"PHP MYSQL分页代码"提供了一个实用的解决方案,结合了PHP和MySQL两种技术来实现高效的数据分页功能。 首先,让我们深入了解PHP和MySQL在分页中的角色。PHP是一种广泛使用的服务器端脚本语言,常用于动态网站...

    关于Mysql分页的两种方法,假分页和limit分页

    另外,如果可能的话,可以考虑使用ROW_NUMBER()函数,配合CTE(Common Table Expression)来实现分页,尤其是在MySQL 8.0及以上版本,这种方法在处理大数据分页时更为高效,因为它避免了大偏移量的问题。 此外,...

    基于hibernate_mysql分页通用源码

    【标题】"基于hibernate_mysql分页通用源码"涉及的关键知识点主要集中在Java Web开发领域,特别是关于ORM框架Hibernate、关系型数据库MySQL、MVC框架Struts2以及分页技术的应用。以下是对这些核心概念的详细解释: ...

    mysql分页实例

    在这个"mysql分页实例"中,我们将深入探讨MySQL的分页查询技术,并提供可以直接引用的分页类。 首先,我们要理解SQL中的基础分页查询语句。在MySQL中,最常用的分页查询方法是结合`LIMIT`和`OFFSET`关键字。`LIMIT`...

    mysql 分页源代码

    在分页查询时,MySQL的LIMIT子句特别有用,它可以高效地从大量数据中只取出需要的部分,从而显著提升性能。 下面是一个简单的分页流程概述: 1. 用户在网页上点击页码或使用导航按钮。 2. JSP接收到请求,解析出...

    封装好的php+mysql分页类

    这个"封装好的php+mysql分页类"提供了一种高效且可复用的方法来实现这一目标。以下是对该分页类的详细解析: 1. **类结构**: 分页类通常包含一些关键属性,如每页显示的记录数($limit)、当前页数($currentPage...

    mysql分页存储过程

    通过上述分析可以看出,这个MySQL分页存储过程实现了灵活且高效的分页查询功能。它不仅能够根据用户提供的参数动态地构建查询语句,还能够处理排序、分组等复杂需求。对于需要频繁进行分页查询的应用场景来说,这种...

    MySql 分页存储过程以及代码调用

    总结来说,MySQL的分页存储过程提供了一种高效、可复用的方式来处理分页查询,减少了直接使用OFFSET可能导致的性能问题。通过创建存储过程并在应用程序中调用,我们可以更好地控制分页逻辑,提高查询速度,提升用户...

    MYSQL分页存储过程

    ### MySQL分页存储过程概述 分页存储过程是一种在数据库层面上实现数据分页的技术。相比应用程序级别的分页,它能更高效地处理数据,减少网络传输的数据量,提升系统性能。在MySQL中,我们可以通过创建存储过程来...

    MySQL分页实现

    4. **MySQL分页工具** 在实际开发中,许多开发者会选择使用ORM(对象关系映射)框架,如Hibernate、MyBatis等,它们通常提供封装好的分页API,简化了数据库分页的操作。同时,也有一些数据库管理工具,如MySQL ...

    PHP+MySql分页显示示例分析.

    以下是一个简单的PHP+MySQL分页显示的示例代码: ```php // 数据库连接 $conn = mysql_connect("localhost", "root", ""); // 设置每页显示记录数 $pagesize = 10; // 获取总记录数 $rs = mysql_query("SELECT ...

    struts2+MySQL分页(精).

    ### Struts2与MySQL分页实现详解 #### 一、背景与目的 随着Web应用的不断发展,用户对于信息展示的需求也越来越高。为了更好地管理和展示大量数据,分页技术成为了一个不可或缺的功能。本文将详细介绍如何利用...

    PHP+MYSQL分页代码

    本主题“PHP+MYSQL分页代码”着重讲解如何在PHP后端和MySQL数据库配合下实现高效、实用的分页功能。下面我们将深入探讨相关知识点。 1. **SQL查询与LIMIT子句**: 在MySQL中,`LIMIT`子句用于在查询结果集中限制...

    C++实现MySQL分页查询

    本篇文章将深入探讨如何利用C++实现MySQL的分页查询功能,这对于处理大量数据时提高系统性能和用户体验至关重要。 首先,我们需要引入MFC(Microsoft Foundation Classes)库,这是一个由Microsoft为Windows平台...

    accss, mysql asp通用分页自定义分页样式

    在IT行业中,数据库查询和网页显示往往涉及到大量的数据处理,特别是在网页展示时,为了提高用户体验,通常会采用分页技术。...通过理解和运用这些知识点,开发者可以创建出高效、美观且用户体验良好的分页系统。

Global site tag (gtag.js) - Google Analytics