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