分頁(yè)技術(shù)原理與實(shí)現(xiàn)之分頁(yè)的意義及方法(一)
什么是分頁(yè)技術(shù)
分頁(yè),是一種將所有數(shù)據(jù)分段展示給用戶的技術(shù).用戶每次看到的不是全部數(shù)據(jù),而是其中的一部分,如果在其中沒(méi)有找到自習(xí)自己想要的內(nèi)容,用戶可以通過(guò)制定頁(yè)碼或是翻頁(yè)的方式轉(zhuǎn)換可見(jiàn)內(nèi)容,直到找到自己想要的內(nèi)容為止.其實(shí)這和我們閱讀書(shū)籍很類似.
下頁(yè)顯示了兩種常見(jiàn)的分頁(yè)方式:
分頁(yè)的意義
分頁(yè)確實(shí)有效,但它一定會(huì)加大系統(tǒng)的復(fù)雜度,但可否不分頁(yè)呢?如果數(shù)據(jù)量少的話當(dāng)然可以.但是對(duì)于企業(yè)信息系統(tǒng)來(lái)說(shuō)數(shù)據(jù)量不會(huì)限制在一個(gè)小范圍內(nèi).如果不顧一切的Select * from某個(gè)表,再將返回的數(shù)據(jù)一古腦的扔給客戶,即使客戶能夠忍受成千上萬(wàn)足夠讓人眼花繚亂的表格式數(shù)據(jù),繁忙的網(wǎng)絡(luò),緊張的服務(wù)器也會(huì)提出它們無(wú)聲的抗議,甚至有時(shí)會(huì)以徹底的罷工作為終結(jié).這個(gè)結(jié)局有點(diǎn)像古代為所欲為的暴君和他忍無(wú)可忍的臣民之間的故事.
程序員不是暴君,他希望程序使生活變得更好而不是更糟.考慮到企業(yè)信息系統(tǒng)多是三層甚至更多層架構(gòu)的事實(shí),程序員在向客戶展示數(shù)據(jù)時(shí)都應(yīng)該采取分頁(yè)的形式.如果他不想被抱怨淹沒(méi)或是半夜被電話驚醒的話。
從請(qǐng)求發(fā)起到返回?cái)?shù)據(jù)的整個(gè)過(guò)程
現(xiàn)在你已經(jīng)下定決心想要分頁(yè)了,在動(dòng)手書(shū)寫(xiě)代碼之前,先讓我們回想一下,在典型的三層架構(gòu)中,從請(qǐng)求發(fā)起到返回?cái)?shù)據(jù)的整個(gè)過(guò)程.如下所示:
在哪里進(jìn)行分頁(yè)
從上面的圖中我們可以觀察得知,在SQL語(yǔ)句處理完畢后,數(shù)據(jù)庫(kù),WebApplication和Browser都能進(jìn)行分頁(yè),那在哪里分頁(yè)好呢?
判斷的標(biāo)準(zhǔn)是速度,顯而易見(jiàn),數(shù)據(jù)庫(kù)服務(wù)器,Web應(yīng)用服務(wù)器和客戶端之間是網(wǎng)絡(luò),如果網(wǎng)絡(luò)傳遞的數(shù)據(jù)量越少,則客戶端獲得響應(yīng)的速度越快.而且一般來(lái)說(shuō),數(shù)據(jù)庫(kù)服務(wù)器和Web應(yīng)用服務(wù)器的處理能力一般比客戶端要強(qiáng)很多.從這兩點(diǎn)來(lái)看,在客戶端分頁(yè)的方案是最不可取的.
其次就剩下了在Web服務(wù)器端分頁(yè)和在數(shù)據(jù)庫(kù)端分頁(yè)兩種方式了,如果選擇在Web服務(wù)器端分頁(yè)的話,大部分的被過(guò)濾掉的數(shù)據(jù)還是被傳輸?shù)搅薟eb應(yīng)用服務(wù)器端,與其這樣還不如直接在數(shù)據(jù)庫(kù)端進(jìn)行分頁(yè).
因此比較好的分頁(yè)做法應(yīng)該是每次翻頁(yè)的時(shí)候只從數(shù)據(jù)庫(kù)里檢索頁(yè)面大小的塊區(qū)的數(shù)據(jù)。這樣雖然每次翻頁(yè)都需要查詢數(shù)據(jù)庫(kù),但查詢出的記錄數(shù)很少,網(wǎng)絡(luò)傳輸數(shù)據(jù)量不大,如果使用連接池更可以略過(guò)最耗時(shí)的建立數(shù)據(jù)庫(kù)連接過(guò)程。而在數(shù)據(jù)庫(kù)端有各種成熟的優(yōu)化技術(shù)用于提高查詢速度,比在應(yīng)用服務(wù)器層做緩存有效多了。
分頁(yè)的SQL語(yǔ)句
如果我們是通過(guò)JDBC的方式訪問(wèn)數(shù)據(jù)庫(kù),那么就有必要根據(jù)數(shù)據(jù)庫(kù)類型采取不同的SQL分頁(yè)語(yǔ)句,對(duì)于MySQL數(shù)據(jù)庫(kù),我們可以采用limit語(yǔ)句進(jìn)行分頁(yè),對(duì)于Oracle數(shù)據(jù)庫(kù),我們可以采用rownum的方式進(jìn)行分頁(yè).
(1)MySql的Limit m,n語(yǔ)句
Limit后的兩個(gè)參數(shù)中,參數(shù)m是起始下標(biāo),它從0開(kāi)始;參數(shù)n是返回的記錄數(shù)。我們需要分頁(yè)的話指定這兩個(gè)值即可
(2)Oracle數(shù)據(jù)庫(kù)的rownum
在Oracle數(shù)據(jù)庫(kù)中,分頁(yè)方式?jīng)]有MySql這樣簡(jiǎn)單,它需要依靠rownum來(lái)實(shí)現(xiàn).
Rownum表示一條記錄的行號(hào),值得注意的是它在獲取每一行后才賦予.因此,想指定rownum的區(qū)間來(lái)取得分頁(yè)數(shù)據(jù)在一層查詢語(yǔ)句中是無(wú)法做到的,要分頁(yè)還要進(jìn)行一次查詢.
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
其中最內(nèi)層的查詢SELECT * FROM TABLE_NAME表示不進(jìn)行翻頁(yè)的原始查詢語(yǔ)句。ROWNUM <= 40和RN >= 21控制分頁(yè)查詢的每頁(yè)的范圍。
上面給出的這個(gè)分頁(yè)查詢語(yǔ)句,在大多數(shù)情況擁有較高的效率。分頁(yè)的目的就是控制輸出結(jié)果集大小,將結(jié)果盡快的返回。在上面的分頁(yè)查詢語(yǔ)句中,這種考慮主要體現(xiàn)在WHERE ROWNUM <= 40這句上。
選擇第21到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過(guò)ROWNUM <= 40來(lái)控制最大值,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的WHERE ROWNUM <= 40語(yǔ)句,在查詢的最外層控制分頁(yè)的最小值和最大值。這是,查詢語(yǔ)句如下:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40
對(duì)比這兩種寫(xiě)法,絕大多數(shù)的情況下,第一個(gè)查詢的效率比第二個(gè)高得多。
這是由于CBO優(yōu)化模式下,Oracle可以將外層的查詢條件推到內(nèi)層查詢中,以提高內(nèi)層查詢的執(zhí)行效率。對(duì)于第一個(gè)查詢語(yǔ)句,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內(nèi)層查詢中,這樣Oracle查詢的結(jié)果一旦超過(guò)了ROWNUM限制條件,就終止查詢將結(jié)果返回了。
而第二個(gè)查詢語(yǔ)句,由于查詢條件BETWEEN 21 AND 40是存在于查詢的第三層,而Oracle無(wú)法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒(méi)有意義,因?yàn)樽顑?nèi)層查詢不知道RN代表什么)。因此,對(duì)于第二個(gè)查詢語(yǔ)句,Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù),而中間層返回給最外層的也是所有數(shù)據(jù)。數(shù)據(jù)的過(guò)濾在最外層完成,顯然這個(gè)效率要比第一個(gè)查詢低得多。
上面分析的查詢不僅僅是針對(duì)單表的簡(jiǎn)單查詢,對(duì)于最內(nèi)層查詢是復(fù)雜的多表聯(lián)合查詢或最內(nèi)層查詢包含排序的情況一樣有效。
精彩專題分享:
SQL Server分頁(yè)技術(shù)總結(jié):http://www.dbjr.com.cn/Special/604.htm
ASP.NET分頁(yè)功能操作:http://www.dbjr.com.cn/Special/149.htm
javascript分頁(yè)功能操作:http://www.dbjr.com.cn/Special/469.htm
jquery分頁(yè)功能操作:http://www.dbjr.com.cn/Special/465.htm
php分頁(yè)功能操作:http://www.dbjr.com.cn/Special/236.htm
其實(shí)分頁(yè)技術(shù)還有很多其它技術(shù),比如:Struts、hibernate等等都可實(shí)現(xiàn)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 默默小談PHP&MYSQL分頁(yè)原理及實(shí)現(xiàn)
- 數(shù)據(jù)庫(kù)分頁(yè)查詢方法
- php 分頁(yè)原理詳解
- PHP 分頁(yè)原理分析,大家可以看看
- php入門(mén)學(xué)習(xí)知識(shí)點(diǎn)二 PHP簡(jiǎn)單的分頁(yè)過(guò)程與原理
- sqlserver2005使用row_number() over分頁(yè)的實(shí)現(xiàn)方法
- SQL SERVER 2008 中三種分頁(yè)方法與比較
- 高效的mysql分頁(yè)方法及原理
- mysql分頁(yè)原理和高效率的mysql分頁(yè)查詢語(yǔ)句
- jquery實(shí)現(xiàn)html頁(yè)面 div 假分頁(yè)有原理有代碼
相關(guān)文章
Linux系統(tǒng)下mysqlcheck修復(fù)數(shù)據(jù)庫(kù)命令(詳解)
下面小編就為大家?guī)?lái)一篇Linux系統(tǒng)下mysqlcheck修復(fù)數(shù)據(jù)庫(kù)命令(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-12-12MySQL并發(fā)更新數(shù)據(jù)時(shí)的處理方法
在后端開(kāi)發(fā)中我們不可避免的會(huì)遇見(jiàn)MySQL數(shù)據(jù)并發(fā)更新的情況,作為一名后端研發(fā),如何解決這類問(wèn)題也是必須要知道的,同時(shí)這也是面試中經(jīng)??疾斓闹R(shí)點(diǎn)。2019-05-05詳解mysql 使用left join添加where條件的問(wèn)題分析
這篇文章主要介紹了詳解mysql 使用left join添加where條件的問(wèn)題分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02MySQL數(shù)據(jù)庫(kù)查詢性能優(yōu)化的4個(gè)技巧干貨
這篇文章主要為大家介紹了MySQL數(shù)據(jù)庫(kù)查詢性能優(yōu)化的4個(gè)技巧干貨詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08mysql數(shù)據(jù)庫(kù)mysql: [ERROR] unknown option ''--skip-grant-tables'
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)mysql: [ERROR] unknown option '--skip-grant-tables',需要的朋友可以參考下2020-03-03MySQL系列教程小白數(shù)據(jù)庫(kù)基礎(chǔ)
這篇文章主要為大家介紹了MySQL系列中的數(shù)據(jù)庫(kù)基礎(chǔ),非常適合數(shù)據(jù)庫(kù)小白的入門(mén)基礎(chǔ)篇,詳細(xì)的講解了數(shù)據(jù)庫(kù)的基本概念以及基礎(chǔ)命令及操作示例,有需要的朋友可以借鑒參考下2021-10-10