部分 來源 https://blog.csdn.net/yudaoai/article/details/4278030
物理分頁
物理分頁:在數據庫執行查詢時(實現分頁查詢),查詢需要的數據 ---- 依賴數據庫SQL語句,屬於後臺分頁
Mysql /SQLServer / Oracle 每種數據庫寫法不同的
mysql 使用limit ,SQLServer 使用top ,Oracle使用rowNum
在MySQL數據庫中offset關鍵字的意思是"越過",而limit關鍵字的意思是“限制”,利用這兩者結合可輕鬆物理分頁。
(1)取得符合條件的結果集,包含全字段。
(2)利用offset關鍵字越過一段結果集(被越過的結果集就是"(當前頁 - 1) * 一頁顯示數")。
(3)利用limit關鍵字限制取得一段結果集(被限制取得的結果集就是一頁顯示數)
語法:select * from 表名 LIMIT ? , ?;
第一個參數 ? (當前頁數 -1) * 當前頁數要顯示的數據條數
第二個參數 ? 代表的是實際頁數要顯示的數據條數(這一頁要顯示多少數據)
第一頁SELECT * FROM product LIMIT 0, 3 --> 0,1,2
第二頁SELECT * FROM product LIMIT 3, 3 --> 3,4,5
第三頁SELECT * FROM product LIMIT 6, 3 --> 6,7,8
9, 3 ---> 9,10,11
12, 3 ---? 12,13,14
邏輯分頁
邏輯分頁:先查詢所有數據到內存,再從內存截取需要數據 ------- 採用程序內部邏輯,屬於前臺分頁
查詢所有數據 List, list.subList 截取你需要數據
例如:查詢第11到第30條數據 list.subList(開始索引,結束索引); // 前取到,後取不到 ----- list.subList(10,30);
邏輯分頁的第一種方式,利用ResultSet的滾動分頁。步驟如下:
a.根據條件sql查詢數據庫。
b.得到ResultSet的結果集,由於ResultSet帶有遊標,因此可以使用其next()方法來指向下一條記錄。
c.利用next()方法,得到分頁所需的結果集。
邏輯分頁的第二種方式
利用Scrollable ResultSets(可滾動結果集合)來快速定位到某個遊標所指定的記錄行,所使用的是ResultSet的absolute()方法。
/**
* 邏輯分頁方法二,使用absolute()方法分頁
*
* @param currentPage
* 當前頁
* @param showRows
* 一頁顯示的數據量
*/
public List<Bars> pageListTwo(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<Bars> resultList = new ArrayList<Bars>();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_PAGE);
rs = ps.executeQuery();
// 過濾結果集的變量
int skipBegin = (currentPage - 1) * showRows;
int skipEnd = currentPage * showRows;
// 利用rs.absolute進行定位
if (!rs.absolute(skipBegin))
return resultList;
// 當返回結果集中有記錄時
while (rs.next()) {
// 以下情況將保證在結果集中有記錄時的應用
if (skipBegin < skipEnd) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
if (skipBegin == skipEnd - 1)
break;
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
對比
- 數據庫負擔
物理分頁每次都訪問數據庫,邏輯分頁只訪問一次數據庫,物理分頁對數據庫造成的負擔大。
- 服務器負擔
邏輯分頁一次性將數據讀取到內存,佔用了較大的內容空間,物理分頁每次只讀取一部分數據,佔用內存空間較小。
- 實時性
邏輯分頁一次性將數據讀取到內存,數據發生改變,數據庫的最新狀態不能實時反映到操作中,實時性差。物理分頁每次需要數據時都訪問數據庫,能夠獲取數據庫的最新狀態,實時性強。
- 使用場合
邏輯分頁主要用於數據量不大、數據穩定的場合,物理分頁主要用於數據量較大、更新頻繁的場合。
總結
- 物理分頁速度上並不一定快於邏輯分頁,邏輯分頁速度上也並不一定快於物理分頁。
- 物理分頁總是優於邏輯分頁:沒有必要將屬於數據庫端的壓力加諸到應用端來,就算速度上存在優勢, 然而其它性能上的優點足以彌補這個缺點。
- 在分頁工作前,有必要了解使用數據庫本身的一些sql語句特點更好的分頁