目前最快的分页..十万数据也在10~20Ms

原创 2005年04月24日 18:44:00

在我们做网站开发,都采用 Asp,PHP,Jsp 等等的语言编写,而Asp更是大家的至爱,因为它开发简便,运用灵活。在编写Asp的同时,也有不少朋友为了分页的效率头痛。如果是小型的应用,比如数据表中的记录预计在几千条以内的,我们可以用自带的分页,而不用去考虑太多效率的问题。但如果应用是在上万甚至几十万,上千万的数据量,自带的分页就显得力不从心了,因为它把所有的记录都读取了出来,数据越多越慢。所以我借助这次的机会,让大家一齐讨论这个问题。

调试环境:
Microsoft Windows 2000 Advanced Server
Microsoft SQL Server 2000 Enterprise
IIS 5.0
IE 6.0

好的分页,应该读取当页所需的记录,而不是所有的数据,以便系统能快速地响应。我曾经常用的方法就是:
EndID = (CurrentPage - 1) * PageSizer
StartID = EndID - PageSizer
SQL = "Select * From [table] Where ID In(Select Top "& EndID &" ID From [table]) And ID Not In(Select Top "& StartID &" ID From [table])"
Set rs = Conn.Execute(SQL)
........

原理很简单,就是先返回 EndID 之前的数据,然后用 Not In,剔除StartID以上的数据,剩下的就是当前页面的数据了。
虽然这个分页的方法比Asp自带的分页更节省资源。但是,我们知道 In 是不支持索引的,所以也受到了In的限制;另外,如果需要降序排列(我们默认ID为主键,升序),那么里面的两个子查询都需要降序语句,外面的语句也是,我们都知道了排序需要花费不少的时间,而花费这些资源往往就是拖慢整个程序效率的关键所在!

所以我这次设计论坛的时候,为了适应容纳海量数据,而重新调整了分页的方案,大家也可以参照这种方式,设计出一个适合你们自己的分页。
我先简略介绍一下数据库的设计,帖子数据表有两个,A表用于存储主题信息,也就是“楼主”的帖子,主要用于分论坛显示帖子列表,在浏览帖子的时候不会用到;B表用于存储所有的帖子,包括“楼主”的帖子,用于浏览帖子时候调用。我会在这里讲解主题列表的分页设计。
首先我们要处理最影响效率的地方,就是排序的问题了。现今论坛使用的默认排序方式就是按照时间降序排列,我们不应该在编写SQL语句的时候在语句里面写排序,这是最大影响效率的关键所在!现今论坛默认的排序方式是按照最后回复时间降序排列,我们可以在回复了的帖子的主题序列update 为 Max(ID)+1,我们可以把此字段设置为主键,降序,那么有人回复了之后,主题就在数据库里面‘浮’上来了,那么也方便后面的工作。而帖子的定位ID则为自增长ID!
EndID = (CurrentPage - 1) * PageSizer
SQL语句部分为:SQL = "Select Top "& PageSizer &" * From [topic] Where [ID]<(Select Min(ID) As [MaxID] From (Select Top "& EndID &" [ID] From [topic]))"
语句解释:最里面的子查询:Select Top "& EndID &" [ID] From [topic] 列出当前页面以前的集合
语句2:Select Min(ID) As [MaxID] From (Select Top "& EndID &" [ID] From [topic]),得出以上集合的最小ID,就是小于当前页面最大ID的上一个ID,那么我们可以在最后用 ID<这个ID


原理是用MIN取出某点 ID,如果是升序,则用 Max。
都是很简单的原理,因为Min运行速度很快,所以可以利用他快速找出记录ID

用于论坛上面,其实更多的是读取第一页,所以第一页我们直接 Select Top PageSizer * From ..... 就可以了。
用了这种分页之后,在翻页的时候比过往快多了,解决了一直头痛的问题!
欢迎各位朋友与我讨论,一齐探讨更好的算法.

2004年5月31日 9:02

据说:原创经典实例spring+mybatis+分页+百万数据

  • 2012年09月22日 23:59
  • 8.51MB
  • 下载

刚刚完成了一个开源分页排序框架——SmartPagination

 项目主页:http://code.google.com/p/smartpagination/SVN:http://smartpagination.googlecode.com/svn/trunk/源...
  • daquan198163
  • daquan198163
  • 2009年10月30日 11:15
  • 834

SSH超实用分页实现(原创开源)

SSH的分页网上有不少的例子,有利用session的,有利用分页组件的。我几个师兄原来搞的SSH项目也有一个成熟的分页插件。 具体业务实现类中的分页方法: public List get*****...
  • jdfkldjlkjdl
  • jdfkldjlkjdl
  • 2013年08月25日 18:01
  • 1624

MySQL 百万级分页优化(Mysql千万级快速分页)

一般刚开始学SQL的时候,会这样写 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但在数据达到百万级的时候,这样写会慢死 SELECT * FR...
  • li772030428
  • li772030428
  • 2016年10月17日 16:59
  • 3368

千万级数据分页实现

海量数据分页,已经无法使用数据库自带的分页机制,比如MySQL 的 Limit ,这会导致严重的性能问题 1.问题的提出  在软件开发中,大数据量的查询是一个常见的问题,经常会遇到对大量...
  • echocdzh
  • echocdzh
  • 2016年01月07日 15:14
  • 2794

速度最快的数据库---MEMSQL的安装与部署

1. 什么是MEMSQL      前Facebook工程师创办的MemSQL公司获500万美元投资。号称世界上最快的分布式关系型数据库,兼容MySQL但快30倍,能实现每秒150万次事务。原理是仅用...
  • current_person
  • current_person
  • 2016年08月23日 18:28
  • 2647

MemSQL初体验 - (1)传说中速度最快的关系数据库软件

最快的RDBMS数据库是哪个呢,之前人们会在ORACLE/SYBASE/DB2这类大型软件产品中争论不休,而后MSSQL SERVER/MYSQL这类的中小型数据库软件也加入战场,尽管论战热门非凡,但...
  • liqfyiyi
  • liqfyiyi
  • 2016年11月18日 14:28
  • 629

yii2.0 使用分页封装类 分页

第一步:连接收据库,原生代码封装类连的数据库,因为是框架,不能是框架的数据库 第二步:封装的类放在web下面,入口文件,可以自定义;命名 使用封装类 第三步:注意文件名的路径,跳转上一页下一页的路径...
  • li772030428
  • li772030428
  • 2016年09月23日 00:19
  • 760

MySQL处理千万级数据查询、分页(有些地方值得参考,不过原作者好像走歪了)

原文:http://www.2cto.com/database/201305/207782.html 方法尚未验证,过两天实验后上传结果. MySQL处理千万级数据查询、分页   MySQL数据库优...
  • h330531987
  • h330531987
  • 2017年07月19日 15:37
  • 391

近两年跟踪速度较快的算法小结

近两年跟踪速度较快的算法小结
  • jacke121
  • jacke121
  • 2017年01月11日 22:48
  • 868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:目前最快的分页..十万数据也在10~20Ms
举报原因:
原因补充:

(最多只允许输入30个字)