分頁查詢主要有兩種形式:邏輯分頁、物理分頁。數據庫
1.邏輯分頁服務器
1.1 含義:一次性查出全部的數據,而後在代碼邏輯中進行處理,根據頁碼和展現的數量決定具體顯示哪幾條數據性能
1.2 優勢:查詢效率快【直接從內存中讀取】優化
1.3 侷限性: 佔用大量內存,下降服務器的性能spa
2. 物理分頁【推薦使用】code
2.1 含義:根據數據庫提供的分頁功能查詢出須要顯示的具體數據【即:只查詢當前頁面顯示的數據】blog
2.2 優勢: 不影響服務器性能排序
2.3 侷限性: 查詢速率相對較慢【每次翻頁都須要與數據庫進行交互】內存
2.4 Oracle實現:ci
SELECT * FROM ( SELECT ROWNUM AS NUM, T.* FROM ( SELECT * FROM T_USER ORDER BY ID ) T WHERE ROWNUM <= endIndex) WHERE NUM > startIndex
2.4.1 原理: 三層嵌套查詢 + ROWNUM
2.4.2 三層嵌套查詢的做用及緣由:(由內向外)
|
做用 |
緣由 |
第一層 |
排序 |
ORDER BY不能放在WHERE前面 |
第二層 |
取endindex條記錄,並將ROWNUM變爲實際顯示列 |
ROWNUM爲隱藏列,不支持 >或 >= |
第三層 |
截取須要的子集 |
獲取最終結果集 |
2.5 MySql實現
SELECT * FROM actor ORDER BY first_name LIMIT startIndex,pageSize
3. 補充
3.1 子查詢效率低,儘可能減小子查詢的使用
例如:Oracle分頁能夠作如下優化
3.1.1 不須要排序,查詢第一頁
SELECT * FROM T_USER ROWNUM < endIndex
3.1.2 不須要排序,查詢後面幾頁
SELECT * FROM ( SELECT ROWNUM AS NUM, T.* FROM T_USER T WHERE ROWNUM < endIndex) WHERE NUM > startIndex
3.1.3 須要排序,查詢第一頁
SELECT * FROM ( SELECT * FROM T_USER ORDER BY ID ) WHERE ROWNUM <= endIndex
3.1.4 須要排序,查詢後面幾頁
SELECT * FROM ( SELECT ROWNUM AS NUM, T.* FROM ( SELECT * FROM T_USER ORDER BY ID ) T WHERE ROWNUM <= endIndex) WHERE NUM > startIndex
3.2 推薦使用物理查詢的緣由:
3.2.1 邏輯分頁查詢一次性將數據所有讀到內存中,佔用大量的系統資源(尤爲是數據不少的時候),影響其餘軟件的使用,下降服務器的性能
3.2.2 物理分頁查詢只是在翻頁的時候速率較慢,可是翻頁操做使用並不頻繁,相對於邏輯查詢下降服務器性能,該影響基本能夠忽略