Mysql——》limit分頁

一、物理分頁 VS 邏輯分頁

物理分頁 邏輯分頁
使用 數據庫 使用:程序代碼
訪問數據庫 每次訪問數據庫 只訪問一次數據庫,把所以數據緩存在內存中
佔用內存 每次讀取部分數據,內存佔用相對較少 一次性將數據讀取到內存,而在相對佔用較多
實時 實時性強,因爲實時訪問數據庫 實時性弱,一次性將數據讀取到內存,數據如果發生改變,無法將最新數據應用於操作
適用 數據量大,更新頻繁 數據量小,相對穩定

二、Mysql中的limit

1、語法

limit X,Y:跳過前X條數據,讀取Y條數據
X:表示第一個返回記錄行的偏移量,如果X=0,即 limit 0, Y,相當於limit Y
Y:表示返回記錄行的最大數目

2、查詢前N條數據

SELECT * FROM action LIMIT 2;

-- 相當於以下sql
SELECT * FROM action LIMIT 0,2;

在這裏插入圖片描述

3、跳過前X條數據,查詢Y條數據

假設:跳過前2條數據,查詢3條數據,也就是X=2,Y=3

SELECT * from action LIMIT 2,3;

在這裏插入圖片描述

4、分頁

假設:每頁20條數據

-- 
-- 第1頁
SELECT * from action LIMIT 0,20;

-- 第2頁
SELECT * from action LIMIT 20,20;

-- 第3頁
SELECT * from action LIMIT 40,20;

-- 第4頁
SELECT * from action LIMIT 60,20;

-- n頁
SELECT * from action LIMIT (n-1)*20,20;

5、性能

待補充O(∩_∩)O~~

三、Java中的limit 和 skip

前提:一次性將數據讀取到內存中,用List存儲

1、語法

skip(X):表示跳過前X條數據
limit(Y):表示查詢Y條數據

2、查詢前N條數據

假設:當前有10條數據,查詢前5條數據,也就是limit(5)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        testLimit();
    }

    public static void testLimit() {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        List<Integer>  newList = list.stream().limit(5).collect(Collectors.toList());
        System.out.println(newList.toString());
    }
}

在這裏插入圖片描述

3、跳過前X條數據,查詢Y條數據

假設:當前有10條數據,跳過前5條,查詢3條數據,也就是skip(5),limit(3)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        testSkipAndLimit();
    }

    public static void testSkipAndLimit() {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        List<Integer>  newList = list.stream().skip(5).limit(3).collect(Collectors.toList());
        System.out.println(newList.toString());
    }
}

在這裏插入圖片描述

4、分頁

假設:當前有10條數據,每頁3條數據,從第0條數據開始,也就是skip(pageNum*pageSize),limit(pageSize)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        testPage();
    }

    public static void testPage() {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        int pageSize = 3;
        int pageNumMax = list.size() % pageSize == 0 ? list.size() / pageSize : list.size() / pageSize + 1;

        //從第0頁開始,相當於第1頁
        for (int i = 0; i < pageNumMax; i++) {
            List<Integer>  newList = list.stream().skip(i*pageSize).limit(pageSize).collect(Collectors.toList());
            System.out.println("從第0頁開始:"+newList.toString());
        }
        System.out.println();
        //從第1頁開始,更符合人們的思維習慣
        for (int i = 1; i <= pageNumMax; i++) {
            List<Integer>  newList = list.stream().skip((i-1)*pageSize).limit(pageSize).collect(Collectors.toList());
            System.out.println("從第1頁開始:"+newList.toString());
        }
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章