`
tsinglongwu
  • 浏览: 229902 次
  • 性别: 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 30,20;

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

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

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

From:http://www.fuchaoqun.com/2009/04/efficient-pagination-using-mysql/

分享到:
评论

相关推荐

    查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题.doc

    查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题.doc

    深入浅出Mysql优化性能提升.txt

    10-聚簇索引随机主键值的效率.wmv 11-索引覆盖.wmv 12-某聚簇索引排序慢案例分析.wmv 13-索引长度与区分度.wmv 14-伪哈希函数降低索引长度.wmv 15-大数据量分页优化.wmv 16-索引与排序.wmv 17-冗余索引与重复索引....

    BaseModel.rar

    基于yii2,活动查询记录类,精封mysql装数据库,方面条件查询,分页,写入等操作。提升编写代码效率....

    基于extjs的PHP开源实例源码(EfsFrame)

    c) 标准通用分页查询存储过程设计,为业务系统开发过程中的分页查询提升效率。 d) 灵活稳定的编码分配设计,只需要通过配置即可快速实现可满足各种要求的唯一编码。 e) 健全的汉字拼音管理,收录了常用的3万多汉字的...

    EfsFrame(java开发框架) v2.2 源代码.rar

    EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包...3、整体提升企业的项目研发效率; 4、整体提升企业的项目研发的健壮性; 5、最大限度减少企业的项目维护成本;

    EfsFrame(net开发框架) v2.2 源代码.rar

    EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包...3、整体提升企业的项目研发效率; 4、整体提升企业的项目研发的健壮性; 5、最大限度减少企业的项目维护成本;

    EfsFrame(php开发框架) 2.2.rar

    EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包...3、整体提升企业的项目研发效率; 4、整体提升企业的项目研发的健壮性; 5、最大限度减少企业的项目维护成本;

    EfsFrame(php开发框架) v2.2 源代码.rar

    EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包...3、整体提升企业的项目研发效率; 4、整体提升企业的项目研发的健壮性; 5、最大限度减少企业的项目维护成本;

    优化mysql的limit offset的例子

    优化的方法,要么限制访问后面的页数,要么提升高偏移的查询效率。  一个简单的优化办法是使用覆盖查询(covering index)查询,然后再跟全行的做join操作。如: 代码如下:SQL&gt;select * from user_order_info limit...

    天涯社区开源的NoSQL数据库 Memlink.zip

    Memlink是天涯社区开发的一个高性能...比如论坛的主题列表,当数据达到百万、千万量级,采用Mysql系统进行分页浏览时,基本上不能响应,而Memlink则性能提升了上百倍。具体可见Benchmark。 标签:数据引擎

    DOYO通用建站系统 2.3.rar

    11、优化html静态生成功能,建议开启curl函数,大幅提升生成效率。12、增加模板导入导出工具,同步备份现有模板及数据,方便模板安装转移和分享。13、增加模板附件(图片、样式表、js)目录,增强模板安全性。14、全新...

    CoverCMS内容管理系统

    部分功能效率显著提高,在页面生成上亦有可观的效率提升。 # 支持全站页面url自定义部署,首页允许分页,域名绑定将更加灵活多变。 # 新增类目字段,设置广告,不同子站栏目之间等内容的关联。 # 支持多种类目选择...

    iWebShop开源商城系统

    优化了分页功能,让移动端的分页与电脑端呈现不同的样式 升级快钱PC网关支付接口 修正部分 修复用户密码有特殊字符会被转义的问题从而导致密码错误 淘宝CVS商品导入插件增加商品编码的同步导入 修复分类特价活动...

    黑色幻想舞曲程序2.0

    夜场DJ,兴趣为主导,建立各种题材新颖,舞曲丰富的网站,可以让您的网络知名度迅速提升; 2. 收费网站,舞曲收费类型的网站,用户可以在线充值和消费,简单清晰的盈利模式,确保您以最小的投资,取得最大的...

    Discuz 2.5 最新版

    新社区形态、新技术体系、新门户系统以及新移动化体验,其中新门户系统主要从内容推送、图片裁切、模块管理等角度进行了深度优化,拟帮助站长和编辑更加省时省力地运维网站,提高网站运营管理效率。 Discuz! X2.5...

    易语言NetDB数据库操作中间件

    1、**经过十多天的测试终于有一点小突破,优化核心处理数据,提升并发效率。 2、**以后基本不会再更新现有命令,以后主要更新核心优化。 [2020-2-29] ================ 1、**修正上传或者下载系统占用文件的传输,...

    asp.net知识库

    忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    而CGI效率相对较低,所以也不考虑。由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例113 深克隆效率的比较 141 实例114 transient关键字的应用 143 5.7 接口和内部类 145 实例115 使用sort()方法排序 145 实例116 简化compareTo()方法的重写 146 实例117 策略模式的简单应用 148 实例118 适配器...

Global site tag (gtag.js) - Google Analytics