MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » 大数据量分页(洪量数据分页)的高效实现

大数据量分页(洪量数据分页)的高效实现

www.MyException.Cn  网友分享于:2013-10-31  浏览:102次
大数据量分页(海量数据分页)的高效实现

 

海量数据分页,已经无法使用数据库自带的分页机制,比如MySQL Limit ,这会导致严重的性能问题, 经过生产环境大数据量千万级数据量分页实现的 的总结,目前为止我 所使用 的大数据量分页机制 两条:

 

1. 如果表中存在 连续 的数字列并 索引,那么通过页码即可计算出此字段的范围,直接作范围查询即可:

start = (page-1)*pagesize

end = page*pagesize

select * from table where id >start and id <=end

 

2.  对大量数据旧的分页数据,实际上是固定的,变化的仅仅是前面数页。那么将旧数据导出成一个特殊表,直接以页码为索引列,即可快速分页。

 

成功案例:有问必答网(120ask.com) 的列表页,目前大约共 3000 万主题帖,每页显示 30 条记录,这样大约是 100 万页。将每页要显示的数据作成一个字段,页码 及科室两个字段作 主索引, 因为业务要求要按科室及页码列出主题,同时科室分类存在层次关系,属性子科室的主题,也需要显示在父科室列表中,这样列表的总记录数实际上是超过 3000万的,冗余度大约是 2.5 ,即有 7500 万条记录,每页显示 30 ,即总共大约有 250 万页。现在将数据表重新进行设计,每页要显示的数据,作为一条记录,这样此表仅仅就只有 250 万条记录,也就相当于 250 万条记录的数据表,可胜任 7500 万主题的分页需要。表结构大致如下:
page #当前记录的页码

classid #科室 id

data #当前页要显示的数据  原始主题记录 json 化或 php 序列化后的字符串

 

但此方案的问题就是数据更新及删除的同步问题。 建议是较新数据周期性(如每 4小时 )地重新整理,旧数据可使用较慢的周期(如每天)速度处理。同时删除帖子时应该先删除帖子内容,再 使用异步队列机制处理数据的同步和更新。 虽然带来维护上的麻烦,但有效地处理了大数据量分页显示的问题

 

120ask.com列表页及帖子页,全部使用伪静态方式提供访问, 最长的内科列表页,已经达到了 30万页。

数据的存储使用三台Dell R610 机器存储,每次对列表页或帖子页的访问,均需要从 MySQL 查询。目前已经胜任每日约 9 00万次访问量。如果有任何疑惑,请联系 zhangxugg@163.com 如果你有更好的办法,欢迎一起探讨。

1 楼 babaoqi 2012-09-13  
如果查询只会通过 科室,ID查询,由于科室数量是有限的,每个科室建立一张问题表,
问题表的主键是自增ID,并且按照主键进行范围分区

查询某页问题时
算出start = (page-1)*pagesize
select * from table where id >start limit pagesize;
不要使用end条件比较,主键本身有序,不需要做额外的排序操作,找到start的位置后顺序读取pagesize行,效率还是很快的

缺点
不适合查所有问题


疑问:
可胜任 7500 万主题的分页需要。表结构大致如下:
page #当前记录的页码
classid #科室 id
data #当前页要显示的数据  原始主题记录 json 化或 php 序列化后的字符串

这种方式查询效率很高但如果删除某个问题时,当前page的问题数量就小于 pagesize
2 楼 babaoqi 2012-09-13  
如果问题是按照最后更新时间排序,我说的方式就不适合了,刚才没仔细看清需求,不好意思

文章评论

团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员的鄙视链
程序员的鄙视链
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
如何成为一名黑客
如何成为一名黑客
鲜为人知的编程真相
鲜为人知的编程真相
我是如何打败拖延症的
我是如何打败拖延症的
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员和编码员之间的区别
程序员和编码员之间的区别
 程序员的样子
程序员的样子
老程序员的下场
老程序员的下场
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
漫画:程序员的工作
漫画:程序员的工作
程序员必看的十大电影
程序员必看的十大电影
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
旅行,写作,编程
旅行,写作,编程
每天工作4小时的程序员
每天工作4小时的程序员
10个调试和排错的小建议
10个调试和排错的小建议
代码女神横空出世
代码女神横空出世
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
中美印日四国程序员比较
中美印日四国程序员比较
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
我的丈夫是个程序员
我的丈夫是个程序员
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Java程序员必看电影
Java程序员必看电影
为什么程序员都是夜猫子
为什么程序员都是夜猫子
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
一个程序员的时间管理
一个程序员的时间管理
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有