监理公司管理系统 | 工程企业管理系统 | OA系统 | ERP系统 | 造价咨询管理系统 | 工程设计管理系统 | 甲方项目管理系统 | 签约案例 | 客户案例 | 在线试用
X 关闭
鹰潭网站建设公司

当前位置:工程项目OA系统 > 泛普各地 > 江西OA系统 > 鹰潭OA > 鹰潭网站建设公司

有关MySQL分页

申请免费试用、咨询电话:400-8352-114

鹰潭网站建设www.diyphp.net

PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的陈述,有许多亮点,本文是在原文基础上的进一步延伸。

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

  mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G

  ***************** 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 idASC LIMIT 20;

  处置”下一页”的时分SQL句子可所以:

  SELECT * FROM message WHERE id < 9500 ORDER BY idDESC 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 idASC LIMIT 20,20;

  跳转到第13页:

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

 

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

  注重SQL句子里面的ASC和DESC,若是是ASC取出来的成果,显现的时分记住倒置一下。

  已在60W数据总量的表中测验,作用十分显着。

 

发布:2007-03-31 14:58    编辑:泛普软件 · xiaona    [打印此页]    [关闭]
鹰潭OA
联系方式

成都公司:成都市成华区建设南路160号1层9号

重庆公司:重庆市江北区红旗河沟华创商务大厦18楼

咨询:400-8352-114

加微信,免费获取试用系统

QQ在线咨询

泛普鹰潭网站建设公司其他应用

鹰潭软件开发公司 鹰潭门禁系统 鹰潭物业管理软件 鹰潭仓库管理软件 鹰潭餐饮管理软件 鹰潭网站建设公司