`
wzucxd
  • 浏览: 26564 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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数据总量的表中测试,效果非常明显。

分享到:
评论

相关推荐

    高效的MySQL分页

    总结来说,实现高效的MySQL分页查询需要考虑索引优化、使用新的SQL特性,以及借助合适的开发工具。同时,持续关注数据库性能监控,及时调整和优化查询策略,对于保持系统稳定和提升用户体验具有重要意义。

    C++实现MySQL分页查询

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

    Oracle,SQl,MySql实现分页查询

    ### Oracle、SQL、MySQL 实现分页查询方法详解 在数据库操作中,分页查询是一项非常重要的技术,尤其是在处理大量数据时。本文将基于提供的文件信息,深入探讨三种不同的分页查询方法及其在Oracle、SQL Server...

    易语言MYSQL数据库分页查询

    易语言作为一款中国本土化的编程语言,提供了与MySQL数据库交互的能力,使得开发者能够轻松实现数据库的分页查询功能。本文将详细讲解如何在易语言中进行MySQL数据库的分页查询,并探讨相关技术点。 首先,我们要...

    易语言MYSQL分页查询

    在IT行业中,数据库管理和数据检索是至关重要的环节。...通过以上步骤,开发者可以在易语言环境下构建一个功能完善的MySQL数据库分页查询系统,满足用户在大量数据中快速、高效地查找和浏览信息的需求。

    winform mysql 分页

    2. 创建数据访问层,实现分页查询方法 3. 在WinForm界面设计中使用`DataGridView`展示数据 4. 设计分页导航,更新当前页数并重新加载数据 5. 可选:提供总页数显示和直接输入页码跳转的功能 通过这些步骤,你可以...

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

    在处理大规模数据集时,例如拥有数百万乃至数千万条记录的数据库表,传统的分页查询方法可能会遇到性能瓶颈。特别是使用`LIMIT`进行分页时,随着跳过的记录数增加,查询时间可能会显著延长,导致用户体验下降。 ###...

    mysql 分页源代码

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

    基于springmvc实现分页查询

    分页查询通常与数据库查询优化相结合,例如使用索引、避免全表扫描等,以确保高效的数据检索。 通过以上步骤,我们可以在Spring MVC应用中实现分页查询,从而提升用户体验,降低服务器压力。在实际项目中,还需要...

    tomcat+mysql+jsp 分页查询

    本教程将深入讲解如何利用这三种技术实现分页查询,这对于处理大量数据并优化用户体验至关重要。 首先,`Tomcat`是Apache软件基金会的一个开源Java Servlet容器,它实现了Java EE中的Web应用程序规范,特别是...

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

    MySQL高效分页解决方案是数据库管理中的重要议题,特别是在大数据量的场景下,传统的LIMIT与OFFSET方法在处理分页时性能会显著下降。本文主要探讨了三种优化MySQL分页查询的方法,旨在提高查询效率。 首先,最基本...

    java语言的分页查询功能(mysql和sql server)

    理解分页原理和数据库分页语法,掌握JDBC基本用法,再根据实际需求选择是否使用框架进行优化,是实现高效分页查询的关键。无论是在MySQL还是SQL Server中,正确地实现分页都能显著提升应用性能和用户体验。

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

    此外,还有一些其他策略可以优化MySQL的分页性能,例如,使用存储过程来封装分页查询,或者使用游标进行逐页读取。还可以设计更合理的数据结构和业务逻辑,例如,使用时间戳代替主键进行排序,这样可以避免因主键值...

    高效的jsp分页查询(网摘)

    - **使用LIMIT OFFSET**:在支持的数据库中,使用LIMIT和OFFSET组合进行分页查询,如MySQL。 - **游标**:对于大数据量的分页查询,可以使用游标来逐条读取数据,降低内存消耗。 ### 三、实践案例 假设有一个博客...

    Mysql+分页-DEMO.rar

    在本DEMO中,"Mysql+分页-DEMO.rar" 提供了一个使用Delphi7与MySQL结合实现分页查询的示例,这对于构建高效、用户友好的数据浏览界面非常有用。 首先,我们要理解分页的基本概念。分页是一种数据展示策略,它将大量...

    mysql分页实例

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

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

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

    mysql分页存储过程

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

    SSH 分页查询 mysql数据库

    在MySQL这样的关系型数据库中,分页查询可以有效提高用户体验,减少服务器负担,特别是处理大量数据时。 在SSH框架中实现MySQL的分页查询,通常涉及以下步骤: 1. **Struts配置**:首先,需要在Struts的Action类中...

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

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

Global site tag (gtag.js) - Google Analytics