我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何解决mysql深度分页问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何解决mysql深度分页问题

mysql深度分页问题

数据:单表数据25万条。

1.基本分页:耗时0.019秒

select * from cf_qb_info limit 0,20

2.深度分页:耗时10.236秒

select * from cf_qb_info limit 200000,20

3.深度ID分页:耗时0.052秒

提示:如果这一步很慢,count(1) 查询总数应该也会很慢-解决方式:请为主键加上unique索引。 

-- 主键ID字段:NUMID
select NUMID from cf_qb_info limit 200000,20

4.两步走深度分页:耗时0.049秒+0.017秒

基于第三步的缺陷(只能查出ID信息),我们可以先查出分页数据的ID,在根据ID查询数据。

select NUMID from cf_qb_info LIMIT 200000,20
select * from cf_qb_info where NUMID in (
'330681650000202108180227345510',
'330681650000202108171031534500',
'330681650000202108190251532141',
'330681650000202108200246376830',
'330681650000202108210229398665',
'330681650000202108220236113895',
'330681650000202108230230034133',
'330681650000202108231017279739',
'330681650000202108231043456276',
'330681650000202108231051404340',
'330681650000202108240237397251',
'330681650000202108250221489228',
'330681650000202108250241536726',
'330681650000202108260253039326',
'330681650000202108270216016138',
'330681650000202108280234013754',
'330681650000202108290230029720',
'330681650000202108300255579204',
'330681650000202108310234184991',
'330681650000202109010237315937'
);

两步合成一步SQL耗时:11.9秒;这一步着实出乎了我的意料。

select * from cf_qb_info where NUMID in (
 
	select NUMID from (select NUMID from cf_qb_info LIMIT 200000,20) as t
 
);

鉴于这个结果:我们可以在程序里分成两步进行分页查询。

5.一步走深度分页:耗时0.05秒

这一步是对第四步的优化,毕竟两条SQL还需要码代码。利用join 两条SQL合成一条。

SELECT
	* 
FROM
	cf_qb_info a
	JOIN ( SELECT NUMID FROM cf_qb_info LIMIT 200000, 20 ) b ON a.NUMID = b.NUMID

6.集成BeanSearcher框架

原理是使用了BeanSearcher的sql拦截器对SQL进行拦截改造。

①改造Bean

如何解决mysql深度分页问题

②注入Sql拦截器

package com.ciih.qbbs.config;
 
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.myBATisplus.annotation.TableId;
import com.ejlchina.searcher.SearchSql;
import com.ejlchina.searcher.SqlInterceptor;
import com.ejlchina.searcher.SqlSnippet;
import com.ejlchina.searcher.param.FetchType;
import org.springframework.stereotype.Component;
 
import Java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
 

@Component
public class SqlInterceptorImpl implements SqlInterceptor {
    @Override
    public <T> SearchSql<T> intercept(SearchSql<T> searchSql, Map<String, Object> paraMap, FetchType fetchType) {
        
 
        Field[] fields = searchSql.getBeanMeta().getBeanClass().getDeclaredFields();
        String primaryColumnName = null;
        for (Field field : fields) {
            //这里使用了mybatis_plus的注解作为主键标识
            TableId tableId = field.getAnnotation(TableId.class);
            if (tableId != null) {
                if (!"".equals(tableId.value())) {
                    primaryColumnName = tableId.value();
                } else {
                    //驼峰转下划线
                    primaryColumnName = StrUtil.toUnderlineCase(field.getName());
                }
            }
        }
        //如果没有主键标识,则不能进行SQL优化。
        if (primaryColumnName == null) {
            return searchSql;
        }
 
        //正则表达式获取where之后语句
        List<String> limits = ReUtil.findAll("where[\\s\\S]*limit[ ]+[?]{1}[ ]*,[ ]+[?]{1}", searchSql.getListSqlString(), 0);
 
        //如果不分页,则不进行SQL优化,即语句中没有limit关键字不优化。
        if (limits.size() == 0) {
            return searchSql;
        }
 
        //表名小片段
        SqlSnippet tableSnippet = searchSql.getBeanMeta().getTableSnippet();
        //合成子查询SQL
        String inSql = "JOIN ( SELECT " + primaryColumnName + " FROM " + tableSnippet.getSql() + " " + limits.get(0) + " ) t99 ON t1." + primaryColumnName + " = t99." + primaryColumnName + ";";
        //合成整条SQL
        String replace = searchSql.getListSqlString().replace(limits.get(0), inSql);
        //替换
        searchSql.setListSqlString(replace);
        return searchSql;
    }
}

7.万能优化技巧:索引

如何解决mysql深度分页问题

如何解决mysql深度分页问题

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何解决mysql深度分页问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何解决mysql深度分页问题

目录mysql深度分页问题1.基本分页:耗时0.019秒2.深度分页:耗时10.236秒3.深度ID分页:耗时0.052秒4.两步走深度分页:耗时0.049秒+0.017秒5.一步走深度分页:耗时0.05秒6.集成BeanSearcher框
2023-01-09

MySql深分页问题解决

目录1. 问题描述2. 问题分析3. 验证测试3.1 创建两个表3.2 创建两个函数3.3 编写存储过程3.4 编写存储过程3.5 创建索引3.6 验证测试4. 解决方案4.1 使用索引覆盖+子查询优化4.2 起始位置重定义4.3 降级策略
2023-02-03

快速解决mysql深分页问题

目录背景概括1、limit深分页问题描述2、sql慢原因分析聚簇索引和非聚簇索引常见解决方案通过子查询优化标签记录法方案对比实战案例总结背景日常需求开发过程中,相信大家对于limit一定不会陌生,但是使用limit时,当偏移量(offse
2022-07-13

MySQL深分页问题解决思路

这篇文章主要介绍了优雅地解决mysql深分页问题,本文将会讨论当mysql表大数据量的情况,如何优化深分页问题,并附上最近的优化慢sql问题的案例伪代码,需要的朋友可以参考下
2022-12-22

MySQL调优之SQL查询深度分页问题怎么解决

这篇文章主要讲解了“MySQL调优之SQL查询深度分页问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL调优之SQL查询深度分页问题怎么解决”吧!一、问题引入例如当前存在一
2023-07-05

MySQL深分页问题的原因及解决方案

目录前言第一部分:深分页问题的背景和影响什么是深分页?深分页的影响实际场景中的问题第二部分:mysql 索引结构和查询执行流程MySQL 索引概述查询执行流程深分页查询的问题案例分析第三部分:深分页性能下降的原因1. 索引扫描的局限性2.
MySQL深分页问题的原因及解决方案
2024-09-29

mysql limit分页过慢的问题如何解决

本篇内容主要讲解“mysql limit分页过慢的问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql limit分页过慢的问题如何解决”吧!1、使用表的覆盖索引加速分页查询。由
2023-06-20

MySQL深分页问题原理与三种解决方案

目录1 深分页问题1.1 创建表1.2 新增100万条数据1.3 深分页语句1.4 结果分析2 深分页优化方案2.1 方案一2.2 方案二2.2.1 优化语句2.2.2 执行计划2.2.3 结果分析2.3 方案三2.3.1 优化语句2.3.
2023-05-05

如何解决Https页面使用百度分享的问题

小编给大家分享一下如何解决Https页面使用百度分享的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!解决方法解决方法来源于细语呢喃,注意网站可能被墙,需要代理
2023-06-08

pagehelper分页乱套问题如何解决

本篇内容介绍了“pagehelper分页乱套问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用pagehelper遇到的坑说明现
2023-07-04

MySQL深度分页(千万级数据量如何快速分页)

目录前言案例优化小结前言 后端开发中为了防止一次性加载太多数据导致内存、磁盘IO都开销过大,经常需要分页展示,这个时候就需要用到MySQL的LIMIT关键字。但你以为LIMIT分页就万事大吉了么,Too young,too simple啊,
2022-05-20

es分页跨页问题怎么解决

在处理ES分页跨页问题时,可以使用以下方法解决:使用scroll API:scroll API允许在多次请求中保持一个持久化的搜索上下文,从而可以查询大量的数据。首先使用search API进行初始查询,并使用scroll参数指定每次请求返
es分页跨页问题怎么解决
2023-10-28

如何解决分布式任务调度xxl-job问题

这篇文章主要为大家展示了“如何解决分布式任务调度xxl-job问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决分布式任务调度xxl-job问题”这篇文章吧。xxl-job简介XXL-J
2023-06-29

解决pageHelper分页失效以及如何配置问题

这篇文章主要介绍了解决pageHelper分页失效以及如何配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-14

如何解决css高度塌陷问题

这篇文章将为大家详细讲解有关如何解决css高度塌陷问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 高度塌陷在文档流中,父元素的高度默认被子元素撑开,也就是说子元素多高,父元素就多高。但是, 当为子
2023-06-08

编程热搜

目录