在ASP中使用均速分頁(yè)法提高分頁(yè)速度的方法
更新時(shí)間:2007年03月11日 00:00:00 作者:
均速分頁(yè)法
一、適用范圍
均速分頁(yè)法主要適用于文章系統(tǒng),新聞系統(tǒng)等排序方法固定的ASP+ACCESS應(yīng)用
二、特點(diǎn)說明
很多用過一些文章系統(tǒng)或是新聞系統(tǒng)的朋友知道,一般的文章系統(tǒng)或是新聞系統(tǒng),在分類分頁(yè)時(shí),通常是通過讀取數(shù)據(jù)庫(kù)中滿足條件的排序后數(shù)據(jù),然后根據(jù)請(qǐng)求頁(yè)號(hào),通過定位操作,指向某條數(shù)據(jù),并且開始讀取這條數(shù)據(jù)后面的若干條數(shù)據(jù)作為一頁(yè)。這種分頁(yè)方法,原理簡(jiǎn)單,但是存在的問題是每次都需要把數(shù)據(jù)庫(kù)中滿足條件的排序后數(shù)據(jù)都讀取出來,如果有兩千條數(shù)據(jù),這個(gè)還好,如果有兩萬條呢?顯示,這會(huì)占用大量的內(nèi)存,浪費(fèi)很多服務(wù)器資源。當(dāng)然,如果有條件的,可以用SQL數(shù)據(jù)庫(kù),這樣就好辦多了,用一點(diǎn)存儲(chǔ)過程就全部解決了。不過可能很多朋友還是在用ACCESS數(shù)據(jù)庫(kù),這樣就沒有辦法了。當(dāng)然,還有一些程序是把分頁(yè)生成HTML,就像不少下載站點(diǎn)一樣,大家有沒有想過,這樣會(huì)出現(xiàn)什么問題?如果我在后臺(tái)一次添加一條記錄,那么我得把這個(gè)分類中所有的分頁(yè)都重新生成一次HTML,這是肯定的,想想吧,這樣效率是不是很差。
均速分頁(yè)法就是為了解決在ACCESS數(shù)據(jù)庫(kù)中,大量數(shù)據(jù)的分頁(yè)而想出來的。它兼有HTML分頁(yè)和傳統(tǒng)ADO分頁(yè)的優(yōu)點(diǎn)。一是速度快,占用資源少,不管你是第一頁(yè)還是第一百頁(yè),程序速度都是相同的。而且在數(shù)據(jù)添加時(shí),不必把所有分頁(yè)都重新生成。下面我把原理介紹一下
三、分頁(yè)原理
數(shù)據(jù)庫(kù)中有一個(gè)article表,一個(gè)class表,我們不考慮是不是無限級(jí)分類還是兩級(jí)分類,這個(gè)與我們無關(guān)。
[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、生成分頁(yè)
如果class表中有一行數(shù)據(jù)是id為1,classname為“ASP分類”,我們先把所有article中所有classid=1的數(shù)據(jù)都取出來,然后按addtime升序排列,這個(gè)與普通的ADO分面是一樣的,但是,下面我們要進(jìn)行一些處理。
我們動(dòng)態(tài)的在數(shù)據(jù)庫(kù)里生成一個(gè)表,名字叫[page_1],1就是對(duì)應(yīng)的classname為“ASP分類”的ID自動(dòng)編號(hào)。
[page_1] pagenum int, pagestr text
我們先每20條數(shù)據(jù)生成一個(gè)str,每個(gè)str實(shí)際就是顯示時(shí)這20條數(shù)據(jù)庫(kù)的列表,然后為這個(gè)str編個(gè)號(hào)XXX,如果是0-19條記錄,那么XXX就是001,如果是20-39,XXX就是002,以此類推。把str和它的編號(hào)加入page_1中。我們這里假設(shè)最大的是84
大家肯定會(huì)想到,數(shù)據(jù)不可能總是整除19(20個(gè)數(shù)據(jù)應(yīng)該是mod 19)呀,當(dāng)然,我們要處理一下零頭,這些零頭應(yīng)該是最新的數(shù)據(jù)(我們是按addtime)排列的。我們?cè)賱?dòng)態(tài)的建立一個(gè)表,[aritcle_1]
[article_1] id int IDENTITY (1, 1) NOT NULL, artid int, classid int default 0, title varchar(100), addtime datetime
把多出來的零頭數(shù)據(jù)加入這個(gè)表中。
2、數(shù)據(jù)的顯示
定義pagecount是[page_1]的記錄數(shù)
我們分兩種情況來
(1)如果article_1沒有記錄(沒有零頭數(shù)據(jù))
第一頁(yè)是84,83
第二頁(yè)是82,81
第三頁(yè)是80,79
……
第N頁(yè)是 : pagecount-(2*N-2), pagecount-(2*N-2)-1
(2)如果article_1有記錄(有零頭數(shù)據(jù))
第一頁(yè),調(diào)用article_1的數(shù)據(jù),84
第二頁(yè),83,82
……
第N頁(yè)是 : pagecount-(2*N-3), pagecount-(2*N-3)-1
說明一下:其中84,83等等這些數(shù)字,就是在page_1中,你對(duì)應(yīng)的str編號(hào)XXX
說到這里可能大家就比較明白了,均速分頁(yè)法的原理實(shí)際是原來把頁(yè)面分好,在分頁(yè)的時(shí)候直接用頁(yè)面進(jìn)行拼接。這比每次分頁(yè)的時(shí)候從數(shù)據(jù)庫(kù)里直接調(diào)用數(shù)據(jù)再進(jìn)行分頁(yè)要來得省資源。
同時(shí),還可以說明一點(diǎn)的是,你完全可以不建立page_1表,而把這些str保存為HTML,然后在分頁(yè)的時(shí)候讀取出HTML頁(yè)面進(jìn)行拼接。
3、數(shù)據(jù)的添加
在傳統(tǒng)的HTML分頁(yè)中,添加新數(shù)據(jù)后,要把所有的HTML分頁(yè)重新生成一次,在均速分頁(yè)法中,就無需這樣。我們前面已經(jīng)設(shè)定了每個(gè)小頁(yè)面只顯示20條記錄,那么article_1表中,也只保存最多19條記錄。我們新添加一條記錄,那么同時(shí)把這條記錄加入到article_1中,如果article_1中的數(shù)據(jù)已經(jīng)超19,那么就把這里面的數(shù)據(jù)生成一個(gè)str,加上編號(hào)后保存在[page_1]里,當(dāng)然,如果你是用生成HTML的,你可以直接生成一個(gè)HTML。如果article_1中的數(shù)據(jù)已經(jīng)沒有超19,那么就不用管它了。
四、均速分頁(yè)法和傳統(tǒng)分頁(yè)的比較
我用了兩千條數(shù)據(jù)的一個(gè)數(shù)據(jù)庫(kù)進(jìn)行測(cè)試,在XP系統(tǒng)下,P3 1G,256M內(nèi)存的硬件條件下,用均速分頁(yè)法平均速度在50MS,正負(fù)不超過10MS,用普通ADO分頁(yè),速度在85MS,正負(fù)在20-35MS之間,可見用均速分頁(yè)法,在速度和穩(wěn)定性上都是不錯(cuò)的。
當(dāng)然,對(duì)于數(shù)據(jù)庫(kù)小的情況下,這樣的優(yōu)勢(shì)可能并不明顯,或者可能用ADO分頁(yè)來的更快,但是如果在兩萬條數(shù)據(jù)的分頁(yè)中,均速分頁(yè)法的平均速度是普通ADO分頁(yè)法的一半。
當(dāng)然,均速分頁(yè)法也有自己的不足,比如程序復(fù)雜度比傳統(tǒng)分頁(yè)來的高,在數(shù)據(jù)庫(kù)少的時(shí)候性能不如ADO。
五、最后一點(diǎn)說明:
本文主要介紹的是均速分頁(yè)法的一個(gè)原理,我花了一個(gè)晚上用程序進(jìn)行了實(shí)踐,是可行的。但我主要是把str生成HTML后讀取,與本文介紹的數(shù)據(jù)庫(kù)保存str有點(diǎn)不同,不過原理是一樣的。
如果您有條件使用SQL數(shù)據(jù)庫(kù),那么我建議您還是使用存儲(chǔ)過程來實(shí)現(xiàn)分頁(yè)的提速。
如果您有什么疑問,可以http://www.showc.com/中與我交流
一、適用范圍
均速分頁(yè)法主要適用于文章系統(tǒng),新聞系統(tǒng)等排序方法固定的ASP+ACCESS應(yīng)用
二、特點(diǎn)說明
很多用過一些文章系統(tǒng)或是新聞系統(tǒng)的朋友知道,一般的文章系統(tǒng)或是新聞系統(tǒng),在分類分頁(yè)時(shí),通常是通過讀取數(shù)據(jù)庫(kù)中滿足條件的排序后數(shù)據(jù),然后根據(jù)請(qǐng)求頁(yè)號(hào),通過定位操作,指向某條數(shù)據(jù),并且開始讀取這條數(shù)據(jù)后面的若干條數(shù)據(jù)作為一頁(yè)。這種分頁(yè)方法,原理簡(jiǎn)單,但是存在的問題是每次都需要把數(shù)據(jù)庫(kù)中滿足條件的排序后數(shù)據(jù)都讀取出來,如果有兩千條數(shù)據(jù),這個(gè)還好,如果有兩萬條呢?顯示,這會(huì)占用大量的內(nèi)存,浪費(fèi)很多服務(wù)器資源。當(dāng)然,如果有條件的,可以用SQL數(shù)據(jù)庫(kù),這樣就好辦多了,用一點(diǎn)存儲(chǔ)過程就全部解決了。不過可能很多朋友還是在用ACCESS數(shù)據(jù)庫(kù),這樣就沒有辦法了。當(dāng)然,還有一些程序是把分頁(yè)生成HTML,就像不少下載站點(diǎn)一樣,大家有沒有想過,這樣會(huì)出現(xiàn)什么問題?如果我在后臺(tái)一次添加一條記錄,那么我得把這個(gè)分類中所有的分頁(yè)都重新生成一次HTML,這是肯定的,想想吧,這樣效率是不是很差。
均速分頁(yè)法就是為了解決在ACCESS數(shù)據(jù)庫(kù)中,大量數(shù)據(jù)的分頁(yè)而想出來的。它兼有HTML分頁(yè)和傳統(tǒng)ADO分頁(yè)的優(yōu)點(diǎn)。一是速度快,占用資源少,不管你是第一頁(yè)還是第一百頁(yè),程序速度都是相同的。而且在數(shù)據(jù)添加時(shí),不必把所有分頁(yè)都重新生成。下面我把原理介紹一下
三、分頁(yè)原理
數(shù)據(jù)庫(kù)中有一個(gè)article表,一個(gè)class表,我們不考慮是不是無限級(jí)分類還是兩級(jí)分類,這個(gè)與我們無關(guān)。
[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、生成分頁(yè)
如果class表中有一行數(shù)據(jù)是id為1,classname為“ASP分類”,我們先把所有article中所有classid=1的數(shù)據(jù)都取出來,然后按addtime升序排列,這個(gè)與普通的ADO分面是一樣的,但是,下面我們要進(jìn)行一些處理。
我們動(dòng)態(tài)的在數(shù)據(jù)庫(kù)里生成一個(gè)表,名字叫[page_1],1就是對(duì)應(yīng)的classname為“ASP分類”的ID自動(dòng)編號(hào)。
[page_1] pagenum int, pagestr text
我們先每20條數(shù)據(jù)生成一個(gè)str,每個(gè)str實(shí)際就是顯示時(shí)這20條數(shù)據(jù)庫(kù)的列表,然后為這個(gè)str編個(gè)號(hào)XXX,如果是0-19條記錄,那么XXX就是001,如果是20-39,XXX就是002,以此類推。把str和它的編號(hào)加入page_1中。我們這里假設(shè)最大的是84
大家肯定會(huì)想到,數(shù)據(jù)不可能總是整除19(20個(gè)數(shù)據(jù)應(yīng)該是mod 19)呀,當(dāng)然,我們要處理一下零頭,這些零頭應(yīng)該是最新的數(shù)據(jù)(我們是按addtime)排列的。我們?cè)賱?dòng)態(tài)的建立一個(gè)表,[aritcle_1]
[article_1] id int IDENTITY (1, 1) NOT NULL, artid int, classid int default 0, title varchar(100), addtime datetime
把多出來的零頭數(shù)據(jù)加入這個(gè)表中。
2、數(shù)據(jù)的顯示
定義pagecount是[page_1]的記錄數(shù)
我們分兩種情況來
(1)如果article_1沒有記錄(沒有零頭數(shù)據(jù))
第一頁(yè)是84,83
第二頁(yè)是82,81
第三頁(yè)是80,79
……
第N頁(yè)是 : pagecount-(2*N-2), pagecount-(2*N-2)-1
(2)如果article_1有記錄(有零頭數(shù)據(jù))
第一頁(yè),調(diào)用article_1的數(shù)據(jù),84
第二頁(yè),83,82
……
第N頁(yè)是 : pagecount-(2*N-3), pagecount-(2*N-3)-1
說明一下:其中84,83等等這些數(shù)字,就是在page_1中,你對(duì)應(yīng)的str編號(hào)XXX
說到這里可能大家就比較明白了,均速分頁(yè)法的原理實(shí)際是原來把頁(yè)面分好,在分頁(yè)的時(shí)候直接用頁(yè)面進(jìn)行拼接。這比每次分頁(yè)的時(shí)候從數(shù)據(jù)庫(kù)里直接調(diào)用數(shù)據(jù)再進(jìn)行分頁(yè)要來得省資源。
同時(shí),還可以說明一點(diǎn)的是,你完全可以不建立page_1表,而把這些str保存為HTML,然后在分頁(yè)的時(shí)候讀取出HTML頁(yè)面進(jìn)行拼接。
3、數(shù)據(jù)的添加
在傳統(tǒng)的HTML分頁(yè)中,添加新數(shù)據(jù)后,要把所有的HTML分頁(yè)重新生成一次,在均速分頁(yè)法中,就無需這樣。我們前面已經(jīng)設(shè)定了每個(gè)小頁(yè)面只顯示20條記錄,那么article_1表中,也只保存最多19條記錄。我們新添加一條記錄,那么同時(shí)把這條記錄加入到article_1中,如果article_1中的數(shù)據(jù)已經(jīng)超19,那么就把這里面的數(shù)據(jù)生成一個(gè)str,加上編號(hào)后保存在[page_1]里,當(dāng)然,如果你是用生成HTML的,你可以直接生成一個(gè)HTML。如果article_1中的數(shù)據(jù)已經(jīng)沒有超19,那么就不用管它了。
四、均速分頁(yè)法和傳統(tǒng)分頁(yè)的比較
我用了兩千條數(shù)據(jù)的一個(gè)數(shù)據(jù)庫(kù)進(jìn)行測(cè)試,在XP系統(tǒng)下,P3 1G,256M內(nèi)存的硬件條件下,用均速分頁(yè)法平均速度在50MS,正負(fù)不超過10MS,用普通ADO分頁(yè),速度在85MS,正負(fù)在20-35MS之間,可見用均速分頁(yè)法,在速度和穩(wěn)定性上都是不錯(cuò)的。
當(dāng)然,對(duì)于數(shù)據(jù)庫(kù)小的情況下,這樣的優(yōu)勢(shì)可能并不明顯,或者可能用ADO分頁(yè)來的更快,但是如果在兩萬條數(shù)據(jù)的分頁(yè)中,均速分頁(yè)法的平均速度是普通ADO分頁(yè)法的一半。
當(dāng)然,均速分頁(yè)法也有自己的不足,比如程序復(fù)雜度比傳統(tǒng)分頁(yè)來的高,在數(shù)據(jù)庫(kù)少的時(shí)候性能不如ADO。
五、最后一點(diǎn)說明:
本文主要介紹的是均速分頁(yè)法的一個(gè)原理,我花了一個(gè)晚上用程序進(jìn)行了實(shí)踐,是可行的。但我主要是把str生成HTML后讀取,與本文介紹的數(shù)據(jù)庫(kù)保存str有點(diǎn)不同,不過原理是一樣的。
如果您有條件使用SQL數(shù)據(jù)庫(kù),那么我建議您還是使用存儲(chǔ)過程來實(shí)現(xiàn)分頁(yè)的提速。
如果您有什么疑問,可以http://www.showc.com/中與我交流
相關(guān)文章
asp利用Split函數(shù)進(jìn)行多關(guān)鍵字檢索
怎樣提取數(shù)據(jù)庫(kù)用|隔開的字!2009-09-09asp中利用CSW中文分詞組件來實(shí)現(xiàn)自己網(wǎng)站的內(nèi)容關(guān)鍵詞自動(dòng)提取
asp中利用CSW中文分詞組件來實(shí)現(xiàn)自己網(wǎng)站的內(nèi)容關(guān)鍵詞自動(dòng)提取...2007-03-03ASP 處理JSON數(shù)據(jù)的實(shí)現(xiàn)代碼
今天看網(wǎng)頁(yè)才發(fā)現(xiàn)了ASP也能處理JSON數(shù)據(jù)?呵呵,剛才論壇上看到一個(gè)兄弟寫的文章,沒有測(cè)試,不過理論上一定是可以的,之前腳本之家小編也發(fā)過類似的文章都可以看下2017-07-07