Mysql——》limit分页

  • 一、物理分页 VS 逻辑分页
  • 二、Mysql中的limit
  • 1、语法
  • 2、查询前N条数据
  • 3、跳过前X条数据,查询Y条数据
  • 4、分页
  • 5、性能
  • 三、Java中的limit 和 skip
  • 1、语法
  • 2、查询前N条数据
  • 3、跳过前X条数据,查询Y条数据
  • 4、分页


一、物理分页 VS 逻辑分页


物理分页

逻辑分页

使用

数据库

使用:程序代码

访问数据库

每次访问数据库

只访问一次数据库,把所以数据缓存在内存中

占用内存

每次读取部分数据,内存占用相对较少

一次性将数据读取到内存,而在相对占用较多

实时

实时性强,因为实时访问数据库

实时性弱,一次性将数据读取到内存,数据如果发生改变,无法将最新数据应用于操作

适用

数据量大,更新频繁

数据量小,相对稳定

二、Mysql中的limit

1、语法

limit X,Y:跳过前X条数据,读取Y条数据X:表示第一个返回记录行的偏移量,如果X=0,即 limit 0, Y,相当于limit YY:表示返回记录行的最大数目

2、查询前N条数据

SELECT * FROM action LIMIT 2;

-- 相当于以下sql
SELECT * FROM action LIMIT 0,2;

使用ldapRepository 分页 limit 分页_skip

3、跳过前X条数据,查询Y条数据

假设:跳过前2条数据,查询3条数据,也就是X=2,Y=3

SELECT * from action LIMIT 2,3;

使用ldapRepository 分页 limit 分页_mysql_02

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

使用ldapRepository 分页 limit 分页_分页_03

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

使用ldapRepository 分页 limit 分页_mysql_04

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

使用ldapRepository 分页 limit 分页_使用ldapRepository 分页_05