在ASP中使用均速分页法提高分页速度的方法

均速分页法
一、适用范围
  均速分页法主要适用于文章系统,新闻系统等排序方法固定的ASP+ACCESS应用
二、特点说明
    很多用过一些文章系统或是新闻系统的朋友知道,一般的文章系统或是新闻系统,在分类分页时,通常是通过读取数据库中满足条件的排序后数据,然后根据请求页号,通过定位操作,指向某条数据,并且开始读取这条数据后面的若干条数据作为一页。这种分页方法,原理简单,但是存在的问题是每次都需要把数据库中满足条件的排序后数据都读取出来,如果有两千条数据,这个还好,如果有两万条呢?显示,这会占用大量的内存,浪费很多服务器资源。当然,如果有条件的,可以用SQL数据库,这样就好办多了,用一点存储过程就全部解决了。不过可能很多朋友还是在用ACCESS数据库,这样就没有办法了。当然,还有一些程序是把分页生成HTML,就像不少下载站点一样,大家有没有想过,这样会出现什么问题?如果我在后台一次添加一条记录,那么我得把这个分类中所有的分页都重新生成一次HTML,这是肯定的,想想吧,这样效率是不是很差。
    均速分页法就是为了解决在ACCESS数据库中,大量数据的分页而想出来的。它兼有HTML分页和传统ADO分页的优点。一是速度快,占用资源少,不管你是第一页还是第一百页,程序速度都是相同的。而且在数据添加时,不必把所有分页都重新生成。下面我把原理介绍一下
三、分页原理
    数据库中有一个article表,一个class表,我们不考虑是不是无限级分类还是两级分类,这个与我们无关。
    [article]  id int IDENTITY (1, 1) NOT NULL, classid int default 0, title varchar(100), addtime datetime
    [class] id int IDENTITY (1, 1) NOT NULL, classname varchar(20)
    1、生成分页
    如果class表中有一行数据是id为1,classname为“ASP分类”,我们先把所有article中所有classid=1的数据都取出来,然后按addtime升序排列,这个与普通的ADO分面是一样的,但是,下面我们要进行一些处理。
    我们动态的在数据库里生成一个表,名字叫[page_1],1就是对应的classname为“ASP分类”的ID自动编号。
    [page_1] pagenum int, pagestr text
    我们先每20条数据生成一个str,每个str实际就是显示时这20条数据库的列表,然后为这个str编个号XXX,如果是0-19条记录,那么XXX就是001,如果是20-39,XXX就是002,以此类推。把str和它的编号加入page_1中。我们这里假设最大的是84
    大家肯定会想到,数据不可能总是整除19(20个数据应该是mod 19)呀,当然,我们要处理一下零头,这些零头应该是最新的数据(我们是按addtime)排列的。我们再动态的建立一个表,[aritcle_1]
    [article_1]  id int IDENTITY (1, 1) NOT NULL, artid int, classid int default 0, title varchar(100), addtime datetime
    把多出来的零头数据加入这个表中。
    2、数据的显示
    定义pagecount是[page_1]的记录数
    我们分两种情况来
    (1)如果article_1没有记录(没有零头数据)
     第一页是84,83
     第二页是82,81
     第三页是80,79
     ……
     第N页是 : pagecount-(2*N-2), pagecount-(2*N-2)-1  
    (2)如果article_1有记录(有零头数据)
     第一页,调用article_1的数据,84
     第二页,83,82
     ……
     第N页是 : pagecount-(2*N-3), pagecount-(2*N-3)-1 
     说明一下:其中84,83等等这些数字,就是在page_1中,你对应的str编号XXX
     说到这里可能大家就比较明白了,均速分页法的原理实际是原来把页面分好,在分页的时候直接用页面进行拼接。这比每次分页的时候从数据库里直接调用数据再进行分页要来得省资源。
     同时,还可以说明一点的是,你完全可以不建立page_1表,而把这些str保存为HTML,然后在分页的时候读取出HTML页面进行拼接。
     3、数据的添加
     在传统的HTML分页中,添加新数据后,要把所有的HTML分页重新生成一次,在均速分页法中,就无需这样。我们前面已经设定了每个小页面只显示20条记录,那么article_1表中,也只保存最多19条记录。我们新添加一条记录,那么同时把这条记录加入到article_1中,如果article_1中的数据已经超19,那么就把这里面的数据生成一个str,加上编号后保存在[page_1]里,当然,如果你是用生成HTML的,你可以直接生成一个HTML。如果article_1中的数据已经没有超19,那么就不用管它了。
四、均速分页法和传统分页的比较
     我用了两千条数据的一个数据库进行测试,在XP系统下,P3 1G,256M内存的硬件条件下,用均速分页法平均速度在50MS,正负不超过10MS,用普通ADO分页,速度在85MS,正负在20-35MS之间,可见用均速分页法,在速度和稳定性上都是不错的。
     当然,对于数据库小的情况下,这样的优势可能并不明显,或者可能用ADO分页来的更快,但是如果在两万条数据的分页中,均速分页法的平均速度是普通ADO分页法的一半。
     当然,均速分页法也有自己的不足,比如程序复杂度比传统分页来的高,在数据库少的时候性能不如ADO。
五、最后一点说明:
    本文主要介绍的是均速分页法的一个原理,我花了一个晚上用程序进行了实践,是可行的。但我主要是把str生成HTML后读取,与本文介绍的数据库保存str有点不同,不过原理是一样的。
    如果您有条件使用SQL数据库,那么我建议您还是使用存储过程来实现分页的提速。
如果您有什么疑问,可以http://www.showc.com/中与我交流

(0)

相关推荐

  • 用GetString提高ASP的速度

    <%   'Create connection / recordset   'Populate data into recordset object   %>  <TABLE>  <% Do While not rs.EOF %>  <TR>  <TD ><%=rs("Field1")% ></TD>  <TD ><%=rs("Field2")% ></

  • 在ASP中使用均速分页法提高分页速度

    一.适用范围 均速分页法主要适用于文章系统,新闻系统等排序方法固定的ASP+ACCESS应用 二.特点说明 很多用过一些文章系统或是新闻系统的朋友知道,一般的文章系统或是新闻系统,在分类分页时,通常是通过读取数据库中满足条件的排序后数据,然后根据请求页号,通过定位操作,指向某条数据,并且开始读取这条数据后面的若干条数据作为一页.这种分页方法,原理简单,但是存在的问题是每次都需要把数据库中满足条件的排序后数据都读取出来,如果有两千条数据,这个还好,如果有两万条呢?显示,这会占用大量的内存,浪费很多

  • asp程序定义变量比不定义变量速度快一倍

    因此,在我接触那么多种语言当中,asp是最不严格的一种,是对程序员要求最低的一种. 昨天测试了asp.net.php和asp的运行速度比较,今天又来冲动,想看看定义变量与不定义变量对asp运行效率的影响有多大,结果令人惊讶,asp程序定义变量比不定义变量速度快一倍! 测试程序还是昨天那个,运行一千万次for循环,获得执行时间. 1.程序没有定义变量(dim i) 复制代码 代码如下: <% dim startime startime=timer() for i = 1 to 10000000 n

  • asp页面提高的访问速度的方法详解

    技巧之一:提高使用Request集合的效率 访问一个ASP集合来提取一个值是费时的.占用计算资源的过程.因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多.因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量.例如将代码写成下面的形式以加快脚本引擎处理速度: 复制代码 代码如下: strTitle=Request.Form("Title")strFirstName=Request.Form("FirstName&quo

  • 在ASP中使用均速分页法提高分页速度的方法

    均速分页法 一.适用范围 均速分页法主要适用于文章系统,新闻系统等排序方法固定的ASP+ACCESS应用 二.特点说明     很多用过一些文章系统或是新闻系统的朋友知道,一般的文章系统或是新闻系统,在分类分页时,通常是通过读取数据库中满足条件的排序后数据,然后根据请求页号,通过定位操作,指向某条数据,并且开始读取这条数据后面的若干条数据作为一页.这种分页方法,原理简单,但是存在的问题是每次都需要把数据库中满足条件的排序后数据都读取出来,如果有两千条数据,这个还好,如果有两万条呢?显示,这会占用

  • asp中通过getrows实现数据库记录分页的一段代码

    <%@ Language = VBSCRIPT %> <% Option Explicit %> <% rem 在asp中通过getrows实现数据库记录分页的一段代码 Dim iStart, iOffset iStart = Request("Start") iOffset = Request("Offset") if Not IsNumeric(iStart) or Len(iStart) = 0 then iStart = 0 e

  • 在asp中通过getrows实现数据库记录分页的一段代码

    复制代码 代码如下: <%@ Language = VBSCRIPT %>  <% Option Explicit %>  <%  rem 在asp中通过getrows实现数据库记录分页的一段代码    Dim iStart, iOffset    iStart = Request("Start")    iOffset = Request("Offset") if Not IsNumeric(iStart) or Len(iStart

  • Asp中使用JQuery的AJAX提交中文乱码解决方法

    客户端页:client.html 复制代码 代码如下: <script>     //jquery的post     $.post     (         'server.asp',         {             Act:'DoSubmit',             UserName:escape('我们'),//进行编码            WebSite:'www.jb51.net'         },         function(data)        

  • ASP中只有UrlEncode,没有Urldecode问题的解决方法?

    在ASP中传递参数时有一个很有用的系统函数Server.UrlEncode,可以将一些非字母数字的特殊符号转换成标准URL编码(其实就是16进制ASC码),这样就解决了参数传递问题,然后我以为也提供了Server.UrlDecode,但使用后却发现程序报错,原来系统并没有提供这个我想象中的解码函数.怎幺办,自己动手吧. UrlEncode的原理其实很简单,就是将特殊字符转换成16进制ASC码值,那么译码函数就只要将16进制ASC转回对应的字符就OK了. Function URLDecode(en

  • asp中把数据导出为excel的2种方法

    我们在做项目的时候经常要将数据库的数据导出到excel中,很多asp用户并不知道怎么写. 这里明凯总结了两种方法来导出excel,希望能帮到大家. 方法一:用excel组件 < % set rs=server.createobject("adodb.recordset") sql="select * from mkusers" rs.open sql,objconn,1,1 Set ExcelApp =CreateObject("Excel.Appl

  • 在ASP中连接MySQL数据库,最好的通过ODBC方法

    折腾了一阵,总算把ASP和MySQL连接完成了,有感,特写此文与大家一同分享. 查了很多资料,ASP和MySQL连接目前有两种办法:一个是使用组件,比较有名是MySQLX,可惜要99美元.二就是使用MyODBC 来连接,下面我们 就来看看第二种方式. 试验的平台: MySQL 4.0 For RadHat Linux (也可以使用for windows) Windows 2003 standard Edition Windows XP English 一.安装MyODBC 1.访问网站 www.

  • python怎么提高计算速度

    下面是python中的一个函数计算代码: loops=25000000 from math import* a=range(1,loops) def f(x): return 3*cos(x)+4*sin(x)**2 %timeit r=(f(x) for x in a) 效率: 1000000 loops, best of 3: 552 ns per loop 下面我们就来看一下提高计算速度的方法: 1.使用数组 import numpy as np a = np.arange(1, loop

  • 在ASP.NET 2.0中操作数据之二十五:大数据量时提高分页的效率

    导言 如我们在之前的教程里讨论的那样,分页可以通过两种方法来实现: 1.默认分页– 你仅仅只用选中data Web control的 智能标签的Enable Paging ; 然而,当你浏览页面的时候,虽然你看到的只是一小部分数据,ObjectDataSource 还是会每次都读取所有数据 2.自定义分页– 通过只从数据库读取用户需要浏览的那部分数据,提高了性能. 显然这种方法需要你做更多的工作. 默认的分页功能非常吸引人,因为你只需要选中一个checkbox就可以完成了.但是它每次都读取所有的

随机推荐