mysql分页查询与ES分页查询解析

本文探讨了MySQL和Elasticsearch(ES)的分页查询。MySQL分页查询有利于减少服务器压力,提升用户体验,PageHelper框架简化了分页实现。在MySQL中,PageHelper通过动态添加LIMIT关键字实现分页。而在ES中,SpringData接口的调整即可实现分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                        mysql分页查询

分页查询的优点

所谓分页,就是查询结果数据较多时,采用按页显示的方法,而不是一次性全部显示

分页的优点:

1. 服务器:一次性查询所有信息,服务器压力大,分页查询服务器压力小
2. 客户端:一次性显示所有信息,需要更多流量,加载时间也会更长,分页显示没有这个问题
3. 用户体验上:一般最有价值的信息都会在前几页显示,也方便用户记忆,多查询出来的数据使用几率很低

实现分页查询需要我们开发过程中多几个步骤

PageHelper实现分页查询

我们可以使用sql语句中添加limit关键字的方法实现分页查询

但是查询分页内容时,我们要自己计算相关的分页信息和参数

limit 0,10      limit  10,10

分页逻辑无论什么业务都是类似的,所以有框架帮助我们高效实现分页功能

PageHelper框架可以实现我们提供页码和每页条数,自动实现分页效果,收集分页信息

PageHelper的分页原理就是在程序运行时,在sql语句尾部添加limit关键字,并按照分页信息向limit后追加分页数据

要想使用,首先还是添加依赖

我们在之前搭建的微服务项目中先编写学习,建议使用csmall-order模块

```xml
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>

PageHelper的基本使用

先编写持久层

我们使用csmall-order-webapi模块来完成分页的测试

首先编写分页的持久层mapper,持久层功能是全查所有订单信息

// 分页查询所有订单
// PageHelper框架是自动在sql语句后添加limit关键字
// 因为这个特性,我们编写的查询语句,和不分页时是一致的
@Select("select id,user_id,commodity_code,count,money from order_tbl")
List<OrderTb> findAllOrders();

注意这个方法并不需要任何分页的参数或返回值,sql也不需要编写limit

都是在业务逻辑层中由PageHelper框架处理的

编写业务逻辑层

下面就转到业务逻辑层实现类,先编写一个方法使用PageHelper的功能

先不用写接口,直接在业务逻辑层中写方法

// 分页查询所有订单的方法
// pageNum是页码
// pageSize是每页条数
public PageInfo<OrderTb> getAllOrdersByPage(Integer pageNum,Integer pageSize){
    // 要想实现PageHelper的分页,首先需要在执行要分页的查询之前
    // 设置分页的条件,也就是要查第几页,每页多少条
    // 这里的pageNum和SpringData分页不同,1就是第一页 2就是第二页
    PageHelper.startPage(pageNum,pageSize);
    // 上面设置完成后,下面再运行的查询语句,就会自动按照给定的pageNum,pageSize生成limit之后的sql语句了
    List<OrderTb> list= orderMapper.findAllOrders();
    // 上面的查询结果就是分页结果,list集合中只有指定页面的数据,并不是全查
    // 下面在方法返回时,不能返回List对象,因为还需要返回分页信息
    // PageHelper框架提供了PageInfo类型对象,既包含查询到的结果,能包含分页信息(自动计算得来)
    return new PageInfo<>(list);

}

                                              ES分页查询

ES分页查询

SpringData框架支持完成分页查询

需要在ItemRepository接口中修改方法的参数和返回值就可以实现

// 分页查询
// 实现分页查询:最后一个参数的位置添加声明类型Pageable的变量
// 返回值修改为Page类型,这个类型的对象不但能够保存查询出的数据,而且还能自动计算出分页信息
// 分页信息中包括:当前页,总页数,总条数,是否有上一页或下一页等
Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
        String title, String brand, Pageable pageable);

测试代码如下

// 分页查询
@Test
void queryPage(){
    int pageNum= 1;  // 页码
    int pageSize=2;  // 每页条数
    Page<Item> page=itemRepository
            .queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
                    "游戏","罗技", PageRequest.of(pageNum-1,pageSize));
    page.forEach(item -> System.out.println(item));
    // page中除了查询得到数据还包含分页信息
    System.out.println("总页数:"+page.getTotalPages());
    System.out.println("总条数:"+page.getTotalElements());
    System.out.println("当前页:"+page.getNumber());
    System.out.println("每页条数:"+page.getSize());
    System.out.println("是否为首页:"+page.isFirst());
    System.out.println("是否为末页:"+page.isLast());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值