java 物理分頁和邏輯分頁

2021-06-22 03:12:36 字數 2136 閱讀 7415

a.邏輯分頁利用游標分頁,好處是所有資料庫都統一,壞處就是效率低。

1.邏輯分頁的第一種方式,利用resultset的滾動分頁。這種分頁方式依靠的是對結果集的演算法來分頁,因此通常被稱為「邏輯分頁」。步驟如下:

a.根據條件sql查詢資料庫。

b.得到resultset的結果集,由於resultset帶有游標,因此可以使用其next()方法來指向下一條記錄。

c.利用next()方法,得到分頁所需的結果集。

2.邏輯分頁的第二種方式,利用scrollable resultsets(可滾動結果集合)來快速定位到某個游標所指定的記錄行,所使用的是resultset的absolute()方法。雖然和第一種方式區別不大,單效率比resultset滾動要好,但是absolute()方法並不是所有jdbc驅動都支援。

b.物理分頁就是資料庫本身提供了分頁方式,如mysql的limit,好處是效率高,不好的地方就是不同資料庫有不同的搞法。hibernate採用的是物理分頁,mybatis預設採用邏輯分頁(資料量大的時候會造成記憶體溢位),不過可以用外掛程式或其他方式能達到物理分頁效果。

1.ibatis中查詢函式主要有queryforlist 和 queryforpaginatedlist,queryforpaginatedlist 是邏輯分頁,據說可以直接分頁, 以至於在資料量大了的時候, 效能急劇下降, 根本不能使用.

2.(如專案2023年寫的幾個專案能達到物理分頁效果)回到 queryforlist, 如下呼叫可以取得queryentities的全部資料:

listentities = entities = getsqlmapclienttemplate().queryforlist("queryentities", paramsmap);如果我們需要知道記錄總數, 則需要:

listrowcount = getsqlmapclienttemplate().queryforlist("getrowcount", paramsmap);

因此**中需要在第一次執行queryentities之前, 先執行getrowcount以取得記錄數目. 而queryentities由於採用了select * from table where condition limit m offset n 語法, 會自動跳過n個結果記錄(0-based), 返回不超過m條記錄. 這要求資料庫支援, mysql, sqlite 可以. 注意, offset n是在返回的結果集中跳過前n個.以上是簡單的ibatis物理分頁的實現, 顯然每次我們翻頁的時候都要執行一次查詢, 但是由於我們只取得limit 條記錄, 因此對伺服器的記憶體消耗是固定的小尺寸. 這對瀏覽大記錄集尤為有用.

3.利用資料庫本身的一些特性來分頁。即:利用了資料庫對sql語法的優化,提高分頁效能。

針對oracle資料庫,步驟如下:

a.根據所使用的資料庫特性來組織sql進行分頁。

b.每次跳轉頁面的sql查詢都不相同。通用的sql分頁方式,「限制行數結果集的倒序」分頁,步驟如下:

(1).取得符合條件的所有結果集中可以唯一標識的key值(通常是主鍵),並正向排序。

(2).利用資料庫提供的特殊方法進行「最大結果集」的限制(在oracle中使用rownum, sql server中使用top, mysql中使用limit...), 該「最大結果集」指包含當前所處頁的所有記錄數,「最大結果集」應該只包含惟一的key值。

(3).對步驟(2)中的「最大結果集」進行逆序,並取得「顯示當前頁顯示數量的結果集」,該結果集中只包含惟一的key值。

(4).通過步驟(3)中所取得的key值取得顯示資料,該顯示資料就是當前頁應該顯示的資料。

針對mysql資料庫,在mysql資料庫中offset關鍵字的意思是"越過",而limit關鍵字的意思是「限制」,利用這兩者結合可輕鬆分頁。

(1)取得符合條件的結果集,包含全欄位。

(2)利用offset關鍵字越過一段結果集(被越過的結果集就是"(當前頁 - 1) * 一頁顯示數")。

(3)利用limit關鍵字限制取得一段結果集(被限制取得的結果集就是一頁顯示數)

分頁結論:

1.物理分頁速度上並不一定快於邏輯分頁,邏輯分頁速度上也並不一定快於物理分頁。

2.物理分頁總是優於邏輯分頁:沒有必要將屬於資料庫端的壓力加諸到應用端來,就算速度上存在優勢,然而其它效能上的優點足以彌補這個缺點。

3.在分頁工作前,有必要了解使用資料庫本身的一些sql語句特點更好的分頁。

物理分頁和邏輯分頁

物理分頁依賴的是某一物理實體,這個物理實體就是資料庫,比如mysql資料庫提供了limit關鍵字,程式設計師只需要編寫帶有limit關鍵字的sql語句,資料庫返回的就是分頁結果。邏輯分頁依賴的是程式設計師編寫的 資料庫返回的不是分頁結果,而是全部資料,然後再由程式設計師通過 獲取分頁資料,常用的操作...

物理分頁和記憶體分頁和邏輯分頁

物理分頁依賴的是某一物理實體,這個物理實體就是資料庫,比如mysql資料庫提供了limit關鍵字,程式設計師只需要編寫帶有limit關鍵字的sql語句,資料庫返回的就是分頁結果。邏輯分頁依賴的是程式設計師編寫的 資料庫返回的不是分頁結果,而是全部資料,然後再由 程式設計師通過 獲取分頁資料,常用的操...

邏輯 記憶體 分頁與物理分頁

本文參考自 物理分頁 物理分頁依賴的是某一物理實體,這個物理實體就是資料庫,即 在查詢資料庫時在庫里執行分頁,比如mysql資料庫提供了limit關鍵字,程式設計師只需要編寫帶有limit關鍵字的sql語句,資料庫返回的就是分頁結果。邏輯 記憶體 分頁 邏輯分頁依賴的是程式設計師編寫的 資料庫返回的...