什麼是分頁技術
分頁,是一種將所有資料分段展示給使用者的技術.使用者每次看到的不是全部資料,而是其中的一部分,如果在其中沒有找到自習自己想要的內容,使用者可以通過制定頁碼或是翻頁的方式轉換可見內容,直到找到自己想要的內容為止.其實這和我們閱讀書籍很類似.
下頁顯示了兩種常見的分頁方式:分頁的意義
分頁確實有效,但它一定會加大系統的複雜度,但可否不分頁呢如果資料量少的話當然可以.但是對於企業資訊系統來說資料量不會限制在乙個小範圍內.如果不顧一切的select * from某個表,再將返回的資料一古腦的扔給客戶,即使客戶能夠忍受成千上萬足夠讓人眼花繚亂的**式資料,繁忙的網路,緊張的伺服器也會提出它們無聲的**,甚至有時會以徹底的罷工作為終結.這個結局有點像古代為所欲為的暴君和他忍無可忍的臣民之間的故事.
程式設計師不是暴君,他希望程式使生活變得更好而不是更糟.考慮到企業資訊系統多是三層甚至更多層架構的事實,程式設計師在向客戶展示資料時都應該採取分頁的形式.如果他不想被抱怨淹沒或是半夜被**驚醒的話。
從請求發起到返回資料的整個過程
現在你已經下定決心想要分頁了,在動手書寫**之前,先讓我們回想一下,在典型的三層架構中,從請求發起到返回資料的整個過程.如下所示:
在**進行分頁
從上面的圖中我們可以觀察得知,在sql語句處理完畢後,資料庫,webapplication和browser都能進行分頁,那在**分頁好呢
判斷的標準是速度,顯而易見,資料庫伺服器,web應用伺服器和客戶端之間是網路,如果網路傳遞的資料量越少,則客戶端獲得響應的速度越快.而且一般來說,資料庫伺服器和web應用伺服器的處理能力一般比客戶端要強很多.從這兩點來看,在客戶端分頁的方案是最不可取的.
其次就剩下了在web伺服器端分頁和在資料庫端分頁兩種方式了,如果選擇在web伺服器端分頁的話,大部分的被過濾掉的資料還是被傳輸到了web應用伺服器端,與其這樣還不如直接在資料庫端進行分頁.
因此比較好的分頁做法應該是每次翻頁的時候只從資料庫裡檢索頁面大小的塊區的資料。這樣雖然每次翻頁都需要查詢資料庫,但查詢出的記錄數很少,網路傳輸資料量不大,如果使用連線池更可以略過最耗時的建立資料庫連線過程。而在資料庫端有各種成熟的優化技術用於提高查詢速度,比在應用伺服器層做快取有效多了。
分頁的sql語句
如果我們是通過jdbc的方式訪問資料庫,那麼就有必要根據資料庫型別採取不同的sql分頁語句,對於mysql資料庫,我們可以採用limit語句進行分頁,對於oracle資料庫,我們可以採用rownum的方式進行分頁.
(1)mysql的limit m,n語句
limit後的兩個引數中,引數m是起始下標,它從0開始;引數n是返回的記錄數。我們需要分頁的話指定這兩個值即可
(2)oracle資料庫的rownum
在oracle資料庫中,分頁方式沒有mysql這樣簡單,它需要依靠rownum來實現.
rownum表示一條記錄的行號,值得注意的是它在獲取每一行後才賦予.因此,想指定rownum的區間來取得分頁資料在一層查詢語句中是無法做到的,要分頁還要進行一次查詢.
select * from
select a.*, rownum rn
from (select * from table_name) a
where rownum <= 40
where rn >= 21
其中最內層的查詢select * from table_name表示不進行翻頁的原始查詢語句。rownum <= 40和rn >= 21控制分頁查詢的每頁的範圍。
上面給出的這個分頁查詢語句,在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,將結果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現在where rownum <= 40這句上。
選擇第21到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過rownum <= 40來控制最大值,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的where rownum <= 40語句,在查詢的最外層控制分頁的最小值和最大值。這是,查詢語句如下:
select * from
select a.*, rownum rn
from (select * from table_name) a
where rn between 21 and 40
對比這兩種寫法,絕大多數的情況下,第乙個查詢的效率比第二個高得多。
這是由於cbo優化模式下,oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第乙個查詢語句,第二層的查詢條件where rownum <= 40就可以被oracle推入到內層查詢中,這樣oracle查詢的結果一旦超過了rownum限制條件,就終止查詢將結果返回了。
而第二個查詢語句,由於查詢條件between 21 and 40是存在於查詢的第三層,而oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道rn代表什麼)。因此,對於第二個查詢語句,oracle最內層返回給中間層的是所有滿足條件的資料,而中間層返回給最外層的也是所有資料。資料的過濾在最外層完成,顯然這個效率要比第乙個查詢低得多。
上面分析的查詢不僅僅是針對單錶的簡單查詢,對於最內層查詢是複雜的多表聯合查詢或最內層查詢包含排序的情況一樣有效。
PHP程式設計之分頁技術
1 php分頁技術作為php開發中的乙個重要的部分,一項是乙個重點和難點,寫這篇文章,希望對剛接觸php沒多久的朋友有些幫助本文適合初學者閱讀,所有示例 均使用php編寫。需要說明的地方有兩個 這個類僅僅處理資料,並不負責處理顯示,因為我覺得將資料的處理和結果的顯示都放到乙個類裡邊實在是有些勉強。顯...
PHP程式設計之分頁技術
1 php分頁技術作為php開發中的乙個重要的部分,一項是乙個重點和難點,寫這篇文章,希望對剛接觸php沒多久的朋友有些幫助本文適合初學者閱讀,所有示例 均使用php編寫。需要說明的地方有兩個 這個類僅僅處理資料,並不負責處理顯示,因為我覺得將資料的處理和結果的顯示都放到乙個類裡邊實在是有些勉強。顯...
PHP分頁技術原理
分頁函式 分頁函式 function page sql,size else else pagesize size no2 每頁顯示多少條 num num rows query sql 獲取總共有幾條資料 no3 設定總共有幾頁 if num 0 else if page pageabsolute n...