目前最快的分页..十万数据也在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

WMS系统开发总结-移库管理-下架与上架

移库管理分两步,先做下架,再做上架。下架时,将药品放到指定的容器中,锁库下架库位的药品库存。 上架时,先选择原存放的容器,再选择上架的库位,再扣原库位的库存,增加新库存的库存。       ...

WMS仓库管理系统---(18)盘点管理初盘单移动盘点

上一章中我们演示了创建初盘单,这一节我们看看怎样使用PDA移动设备进行盘点,使用PDA移动设备进行盘点的目的是移动设备可以时时录入系统库存数量,方便灵活。 我们现在PC端盘点管理中查找下盘点单,然后选...

asp最快的分页写法

  • 2015年05月25日 12:08
  • 1.48MB
  • 下载

最快的存储过程分页 50W

过程一: select top N条记录 * from 文章表 where id not in(select top M条记录 id from 文章表 order by id desc ) orde...

目前速度最快的网络软件

  • 2010年09月07日 10:49
  • 1.3MB
  • 下载

Genymotion目前速度最快的Android模拟器+ova包

安装 注册 1.首先访问Genymotion注册页面  https://cloud.genymotion.com/page/customer/login/?next=/ 2.在注...

android目前最快的模拟器(genymotion)的安装

android项目开发中,我们经常需要用模拟器对程序进行调试,为了加快响应

Ubuntu11.10国内更新源地址汇总以及添加方法(目前最全最快的源)

@author:WMsteve @Email:weisteve@yeah.net @Time:2012年12月5日11:36:11 @ModifyTime:2012年1月5日 15时13分38秒...
  • sTeVes
  • sTeVes
  • 2014年04月03日 16:18
  • 4729
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:目前最快的分页..十万数据也在10~20Ms
举报原因:
原因补充:

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