如何解决 SQL 深层分页问题?

我们可以通过减少回表次数来优化。一般有标签记录法和延迟关联法。

标签记录法

就是标记一下上次查询到哪一条了,下次再来查的时候,从该条开始往下扫描。就好像看书一样,上次看到哪里了,你就折叠一下或者夹个书签,下次来看的时候,直接就翻到啦。

假设上一次记录到100000,则SQL可以修改为:

select  id,name,balance FROM account where id > 100000 limit 10;

这样的话,后面无论翻多少页,性能都会不错的,因为命中了id索引。但是这种方式有局限性:需要一种类似连续自增的字段。

延迟关联法

延迟关联法,就是把条件转移到主键索引树,然后减少回表。假设原生SQL是这样的的,其中id是主键,create_time是普通索引

select id,name,balance from account where create_time> '2020-09-19' limit 100000,10;

使用延迟关联法优化,如下:

select  acct1.id,acct1.name,acct1.balance FROM account acct1 INNER JOIN 
(SELECT a.id FROM account a WHERE a.create_time > '2020-09-19' limit 100000, 10) 
AS acct2 on acct1.id= acct2.id;

优化思路就是,先通过idx_create_time二级索引树查询到满足条件的主键ID,再与原表通过主键ID内连接,这样后面直接走了主键索引了,同时也减少了回表。

相关推荐

  1. 如何解决 SQL 深层问题

    2024-02-21 15:40:02       46 阅读
  2. mysql解决深度问题

    2024-02-21 15:40:02       26 阅读
  3. MySQL__深度问题

    2024-02-21 15:40:02       42 阅读
  4. 面试——深度问题的优化

    2024-02-21 15:40:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-21 15:40:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-21 15:40:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-21 15:40:02       87 阅读
  4. Python语言-面向对象

    2024-02-21 15:40:02       96 阅读

热门阅读

  1. Miniconda 安装和使用笔记

    2024-02-21 15:40:02       56 阅读
  2. jquery将网页html文档导出为pdf图片

    2024-02-21 15:40:02       39 阅读
  3. c# 链表

    2024-02-21 15:40:02       41 阅读
  4. MySQL深入——20

    2024-02-21 15:40:02       46 阅读
  5. 基于python+django+vue.js开发的社区养老管理系统

    2024-02-21 15:40:02       46 阅读
  6. 字母转换并统计行数(C语言实现)

    2024-02-21 15:40:02       41 阅读
  7. Qt _day1

    Qt _day1

    2024-02-21 15:40:02      45 阅读
  8. Oracle12cR2之IMP与EXP命令行工具使用及参数说明

    2024-02-21 15:40:02       62 阅读
  9. 为什么ViewStub是默认不显示的?是懒加载?

    2024-02-21 15:40:02       49 阅读