您当前的位置: 首页 > 数据库教程 > MySQL教程 > 一个高效的MySQL分页代码

一个高效的MySQL分页代码

作者:不详 来源:网络 发布时间: 2011-12-21 14:22 点击:
首先看一下分页的基本原理: mysqlexplain SELECT*FROM message ORDER BY id DESC LIMIT10000,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: 1r

一个高效的MySQL分页代码

  首先看一下分页的基本原理:
  
  mysql>explain SELECT*FROM message ORDER BY id DESC LIMIT10000,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:
  
  1row in set(0.00sec)
  
  limit10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit100000,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>9527ORDER BY id ASC LIMIT20;
  
  处理”下一页”的时候SQL语句可以是:
  
  SELECT*FROM message WHERE id<9500ORDER BY id DESC LIMIT20;
  
  不管翻多少页,每次查询只扫描20行。
  
  缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”<上一页123456789下一页>”这样的链接方式,怎么办呢?
  
  如果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>9527ORDER BY id ASC LIMIT20,20;
  
  跳转到第13页:
  
  SELECT*FROM message WHERE id<9500ORDER BY id DESC LIMIT40,20;
  
  原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。
  
  注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。
  
  已在60W数据总量的表中测试,效果非常明显。

分享到:
本文"一个高效的MySQL分页代码"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(1)
100%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4