有关MySQL分页
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数据总量的表中测验,作用十分显着。
- 1关于PHP防CC攻击
- 2网站制作绝对不可以犯的编程错误2
- 3久途教你怎么样经营自己的网站
- 4网站策划的重要讨论
- 5最全Facebook图片存储架构技术
- 6万网云服务器,优惠啦!!!
- 7网站关键字的确定
- 8PHP 5中垃圾回收算法的演化
- 9关于编码最佳应用实践
- 10网站建设的效果图设计不好导致的一些后果
- 11地方生活优惠电子商务网站需求分析
- 12优质的网站建设方案对网站制作的重要性
- 13O2O已经成为电子商务网站的下一个掘金点
- 14网贷平台主要运营模式主要有两类---传统P2P模式
- 15PHP性能优化大全
- 16P2P网贷的特点
- 17PHP 安全措施
- 18房地产行业微信营销方案1
- 19网贷平台主要运营模式主要有两类---债权转让模式
- 20玩具租赁商城系统需求3
- 21企业建站的重要性
- 22PhoneGap新手总是需要一些基础问题的解答
- 23PHP函数代码段
- 24Zend2.0的MVC完整过程。
- 25玩具租赁商城系统需求6
- 26网站建设搜索功能强化升级版
- 27企业站针对用户的优化
- 28玩具租赁商城系统需求7
- 29久途愿景
- 30HTTPS(安全HTTP)和SSL/TLS(安全套接层/传输层安全)
成都公司:成都市成华区建设南路160号1层9号
重庆公司:重庆市江北区红旗河沟华创商务大厦18楼