当前位置: 首页 > news >正文

数据查询深分页优化方案

大家好,我是冰河~~

最近不少小伙伴在实际工作过程中,遇到了单表大数据量分页的问题,问我怎么优化分页查询。其实,这就是典型的深分页问题。今天趁着周末,给大家整理一些在深分页场景的简单处理方案。

一、普通分页查询存在的问题

如果数据表中的数据量非常大,那么使用类似如下SQL语句分页查询数据,就会导致性能低下。

select * from test limit 10000000, 1000;

性能低下的原因是上述SQL会查询数据表中的10001000条数据,最终舍弃前面的10000000条数据,返回1000条数据。这种大数据量下查询大页码数据的现象,也叫作深分页问题。

二、深分页常见优化方案

常见的深分页方案包括:范围查询、子查询、延迟关联和覆盖索引

2.1 范围查询

如果数据表中存在连续的自增ID,则按照ID的范围查询可以优化一定的性能,例如,下面的SQL。

select * from test where id > 10000000 and id <=  10001000 order by id asc;

也可以记录上一次已经查询到的当前最大ID值,查询大于此ID值的N条数据作为返回结果,如下所示。

select * from test where id > 10000000 limit 1000;

这种方案需要ID连续递增,并且不能解决跳页的问题。

PS:跳页问题的场景是:不连续分页,从第1页直接翻到第2页以外的其他页码,例如从第1页直接翻到第10页等等。

2.2 子查询

通过子查询的方式,可以先查询limit 1这条数据对应的主键值,随后再根据这个主键值作为查询条件查询分页数据,例如下面的查询SQL。

select * from test where id >= (select id from test limit 10000000, 1) limit 1000;

子查询的过程会产生一种新的临时表,会影响到查询性能,并且这种方案只能使用在ID正序的场景。

2.3 延迟关联查询

延迟关联查询的方案中,会使用INNER JOIN,并且包含子查询的方式查询数据。

select t1.* from test t1 INNER JOIN (select id from test limit 10000000, 1000) t2 on (t1.id = t2.id);

这里,还可以使用逗号连接子查询。

select t1.* from test t1, (select id from test limit 10000000, 1000) t2 where t1.id = t2.id;

2.4 覆盖索引

覆盖索引说的是要查询的字段尽量都在索引树中,尽量不要再回表查询数据,假设只需要查询test表中的id, username,则在id和username上添加索引,使得查询的所有字段数据都在索引上。

select id, username from test limit 10000000, 1000;

这种方案需要保证要查询的字段都被添加了索引,但是,如果当前分页查询的数据占整张表的大部分数据时,索引可能失效,造成回表查询。

好了,这就是给大家分享的几种简单处理深分页问题的方案,今天就到这儿吧,我是冰河,我们下期见~~

http://www.lryc.cn/news/367227.html

相关文章:

  • Redis的主从复制
  • 网络安全实战基础——实战工具与攻防环境介绍
  • vue2组件封装实战系列之tag组件
  • VBA实战(Excel)(4):实用功能整理
  • nginx mirror流量镜像详细介绍以及实战示例
  • Android14 WMS-窗口添加流程(二)-Server端
  • 【传知代码】DETR[端到端目标检测](论文复现)
  • Edge浏览器十大常见问题,一次性解决!
  • lubuntu / ubuntu 配置静态ip
  • 15、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)
  • 调试环境搭建(Redis 6.X 版本)
  • postgres数据库报错无法写入文件 “base/pgsql_tmp/pgsql_tmp215574.97“: 设备上没有空间
  • 力扣2762. 不间断子数组
  • OpenCV学习(4.8) 图像金字塔
  • 【TB作品】msp430f5529单片机,dht22,温湿度传感器,OLED显示屏
  • Kotlin 异常处理
  • nltk下载报错
  • Vulnhub-DC5
  • pytorch 笔记:pytorch 优化内容(更新中)
  • vue 创建一个新项目 以及 手动配置选项
  • c#快速获取超大文件夹文件名
  • 华为OD技术面试-最小异或-2024手撕代码真题
  • 基于SpringBoot+Vue单位考勤系统设计和实现(源码+LW+调试文档+讲解等)
  • Anaconda软件:安装、管理python相关包
  • pinia 重置状态插件
  • 一千题,No.0049(跟奥巴马一起编程)
  • 《python程序语言设计》2018版第5章第46题均值和标准方差-上部(我又一次被作者的出题击倒)
  • 自己做的精灵图制作,图片合成,卓宠,窗口置顶,磁力链下载等工具软件
  • C++协程
  • linux系统——ping命令