热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

在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的数据都取出来,(www.knowsky.com)然后按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数据库,那么我建议您还是使用存储过程来实现分页的提速。
推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
author-avatar
爱中华爱美丽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有