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());
}
}
}