主流數據庫分頁查詢介紹

1 背景概述

     因爲在項目中須要在頁面上顯示數量很是多的數據, 在進行數據庫查詢時首先會把全部的數據都查詢出來,而後在進行顯示,這時候分頁查詢的操做就必不可少了,本文介紹Mysql、Oracle、sql Server 三種數據庫進行分頁查詢的用法。
java

2 預期讀者

  1. 數通暢聯內部員工mysql

  2. 廣大計算機愛好者web

3 名詞解釋

  • 分頁查詢算法

    就是將將過多的結果在有限的界面上分多頁來顯示,通常將分頁查詢分爲兩類:邏輯分頁、物理分頁。
    邏輯分頁是在用戶第一次訪問時,將數據庫的全部記錄所有查詢出來,添加到一個大集合中,而後存放在session對象,再經過頁碼計算出當前頁須要顯示的數據內容,存儲到一個小的list的集合中,並將其存儲到request對象中,跳轉到JSP頁面,進行遍歷顯示。 當用戶第二次訪問時,只要不關閉瀏覽器,還會從session中獲取數據,來進行顯示。由於此種方法是在內存的session對象中進行計算分頁顯示的,而不是真正的將咱們數據庫進行分頁的,因此叫作邏輯分頁。
    缺點:若是須要查詢的數據量過大,session將耗費大量的內存;由於是在session中獲取數據,若是第二次或者更多此的不關閉瀏覽器訪問,會直接訪問session,從而不能保證數據是最新的。
    優勢:統一代碼處理方式,較容易跨數據庫作遷移。
    物理分頁,使用數據庫自身所帶的分頁機制,例如,Oracle數據庫的rownum,或者Mysql數據庫中的limit等機制來完成分頁操做。由於是對數據庫的數據進行分頁條件查詢,因此叫物理分頁。每一次物理分頁都會去鏈接數據庫。
優勢:數據可以保證最新,因爲根據分頁條件會查詢出少許的數據,因此不會佔用太多的內存。
sql

  • CTE(Common Table Expression,公用表表達式)數據庫

    該表達式源自簡單查詢,能夠認爲是在單個 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句的執行範圍內定義的臨時結果集。CTE 與派生表相似,具體表如今不存儲爲對象,而且只在查詢期間有效。與派生表的不一樣之處在於,CTE 可自引用,還可在同一查詢中引用屢次。
瀏覽器

4 實現思路

    經過物理分頁的方法進行數據庫查詢。
session

5 實現步驟

    首先經過開發平臺新建一個工程,使用新工程中的系統日誌模塊做爲樣例,進行mysql和oracle的分頁查詢功能
oracle

5.1 Mysql

  • 在數據庫中進行操做:函數

    mysql的分頁查詢是最簡單的,藉助關鍵字limit便可實現查詢,查詢語句通用形式:


select o.* from (sql) o limit firstIndex,pageSize

    其中的sql能夠是單表查詢的結果也能夠是多表查詢的結果
    firstIndex爲顯示結果的起始位置(mysql是從0做爲起始位置的)
    pageSize爲顯示記錄數
    直接對錶進行查詢以下,咱們能夠看到查詢時間是0.005s

wKiom1ZWxEzyLKXTAAFgdhCyTRA028.png
    採用分頁查詢,一頁顯示15條數據,查詢時間是0.001s

wKiom1ZWxGfi1Z6XAAEhlBl71_o675.png

  • 在工程中體現:

    首先在工程中找到SystemLogQueryImpl.java這個類

wKioL1ZWxNvDmBY7AAExoJghKhM210.png
    其中有一點須要注意,方法的返回值須要是PageList而不是List

wKioL1ZWxOuyt7ofAABEQ7x8kFU895.png
    在開發平臺中這個類是日誌功能的服務實現類,

wKiom1ZWxKDyDyjzAADV6sAMsEI607.png
    其中,ec_p爲頁數,ec_rd爲顯示記錄數
    staratNum爲起始索引,endNum爲結束索引
    因爲MySQL的起始索引是從0開始的,須要對獲得的起始索引減一,顯示記錄數的計算方法爲: 結束索引-起始索引+1
    在sqlMap中的體現如圖:

wKioL1ZWxTyxmGmsAABu1e4h08g720.png
    在頁面上的顯示:

wKiom1ZWxL3jxZN1AAJsyRTenA4851.png
    能夠在頁面選擇顯示的頁碼和記錄數


wKioL1ZWxV_yyYUqAAITrx3PwK4963.png

5.2 Oracle

    Oracle的查詢方法有兩種:ROWNUM、row_number()

5.2.1 ROWNUM

  • 在數據庫中進行操做:

    查詢語句通用形式:

select * from(select o.*,ROWNUM num from(sql) o where ROWNUM<=(endIndex)) where num>=firstIndex

    直接對錶進行查詢,耗時16msecs

wKiom1ZWxRrgAFFFAAGBuwyMzgg868.png
    採用分頁算法進行查詢是,耗時7msecs

wKiom1ZWxTuCsMErAAFzkHwvvDE101.png

  • 在工程中體現:

    找到對應的服務實現類:

wKioL1ZWxbDQ9xqGAADfO5TPyhA052.png
    服務實現類的內容:

wKioL1ZWxcKiwi8qAADWA1mhjNE951.png
    startNum爲起始索引,endNum爲結束索引
    由於ROWNUM方法中使用的兩個參數一個是起始索引,一個是結束索引,因此能夠直接使用。
    在sql中的體現:

wKiom1ZWxZCR8D2fAACAZuXDq5E822.png
    在頁面上的效果:


wKiom1ZWxaLTxlNXAAJTaKV23Es068.png

5.2.2 row_number()

    查詢語句通用形式:

select * from(select * from(select t.*,row_number() over(order by orderColumn) as rownumber from(sql) t) p where p.rownumber>firstIndex) where rownum<=pageSize

    直接對錶進行查詢,耗時22msecs

wKioL1ZWxhiyv9DbAAGOT9Hy9VU701.png
    使用分頁查詢語句進行查詢,耗時12msece

wKioL1ZWxifCf9ARAAF8AFn5kak829.png

  • 在工程中體現:

    服務實現類的內容和ROWNUM同樣,區別在sql中

wKiom1ZWxdiy5qlEAACCfjKR4aI046.png
    因爲在sql中添加了order by排序函數,查詢速率會變慢,因此在開發平臺中不採用這種方法。
    對於oracle的分頁查詢,他們的主要區別是:使用rownum進行排序的時候是先對結果集加入僞列rownum而後再進行排序,而函數row_number()在包含排序從句後是先排序再計算行號碼。

5.3 Sqlserver

    因爲sqlserver版本比較多,分頁查詢的方式也有不一樣之處

5.3.1 Sqlserver 2005/2008中使用row_number()

    查詢通用形式:

SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY orderColumn) AS RowNumber FROM tableName) EmployeePage WHERE RowNumber > =startIndex AND RowNumber <= endIndex ORDER BY orderColumn
GO

    直接查詢表,如圖
 
wKiom1ZWxemDqCrvAADyKIPc_dg843.png
    使用分頁查詢,如圖


wKioL1ZWxleTcvrtAAFHeeg7BBk002.png

5.3.2 SQL 2005/2008用CTE的方式實現

     查詢通用形式:

WITH EmployeePage AS (SELECT *,ROW_NUMBER() OVER (ORDER BY orderColumn) AS RowNumber FROM tableName)
SELECT *FROM EmployeePage WHERE RowNumber > =firstIndex AND RowNumber <= endIndex ORDER BY orderColumn
GO

     使用分頁查詢,如圖:

wKiom1ZWxgugzuvTAAF-BfdWcHw429.png

5.3.3 SQL SERVER 2012支持了OFFSET

    查詢通用形式,以下:

SELECT * FROM tableName
ORDER BY orderColumn
OFFSET (page-1) ROWS FETCH NEXT size ROWS ONLY

    Page指須要顯示的頁數
    Size指須要顯示的記錄數
     因爲本人如今沒有sqlserver 2012的數據庫,暫時沒法作性能的測試

6 附件及說明

    附件中有兩個樣例工程pagingquery4mysql和pagingquery4oracle,使用最新版的aeai dp開發平臺導入後查看使用。

主流數據庫分頁查詢介紹文檔及附件       下載

相關文章
相關標籤/搜索