mysql邏輯分頁和物理分頁

部分 來源 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語句特點更好的分頁
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章