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

在我们做网站开发,都采用 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

阅读更多
个人分类: 脚本编程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭