SQL优化之深分页

SQL优化之深分页

我们都知道,大型项目中的SQL语句,应该尽量避免深分页。

那么问题就来了:

  1. 深分页的性能差在哪?
  2. 什么方案能避免深分页呢?

什么是深分页

深分页,即SQL查询过程中,使用的页数过深,数据库执行的过程中,需要遍历前面很多数据并跳过后,才返回数据的过程。

这种情况会导致SQL查询变慢;

深分页的性能问题

上面介绍了深分页的描述,那下面具体看下深分页的性能问题。

1、覆盖索引
select uid from user_info limit 100, 10;
select uid from user_info limit 10000, 10;
select uid from user_info limit 1000000, 10;
select uid from user_info limit 2000000, 10;

在这里插入图片描述

在查询语句能够命中覆盖索引的情况下,可以看到查询范围在[2000000,2000010]的10条数据,耗时近200ms。对于线上千万级的数据表来说,即使查询不需要回表,那也是妥妥的慢查询,

2、非覆盖索引
select * from user_info limit 100, 10;
select * from user_info limit 10000, 10;
select * from user_info limit 1000000, 10;
select * from user_info limit 2000000, 10;

在这里插入图片描述

同样的查询范围,对于需要回表的SQL查询,耗时提高了近4倍,查询效率更低。

深分页的优化

1、Inner Join

使用Inner Join提高深分页,原理是减少查询时的回表次数;

利用id的有序性,通过子查询获取到指定记录的一组id,再查询id对应的记录。

select * from user_info limit 2000000, 10;
select * from user_info
inner join (
 select uid from user_info limit 2000000, 10 
) as sub on sub.uid = user_info.uid;

在这里插入图片描述

2、边界记录

上面的Inner Join 用到了子查询,对性能还是有一定的影响;

如果业务中的页遍历是顺序的,没有跨页的情况,那可以考虑对每次查询接结果,记录返回的最大id,作为下一次查询的开始id。

这样就能避免子查询的使用,同时减少回表次数。

select * from user_info where id >= 2000010 limit 10;

在这里插入图片描述

总结

对于深分页问题,无论是使用Inner Join、还是记录上一个id,核心思路都是要降低回表次数。

相关推荐

  1. MySQL优化

    2024-07-12 10:30:02       34 阅读
  2. 数据查询优化方案

    2024-07-12 10:30:02       28 阅读
  3. sql查询

    2024-07-12 10:30:02       29 阅读
  4. SQL写法

    2024-07-12 10:30:02       55 阅读

最近更新

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

    2024-07-12 10:30:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 10:30:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 10:30:02       58 阅读
  4. Python语言-面向对象

    2024-07-12 10:30:02       69 阅读

热门阅读

  1. Python面试题:如何在 Python 中解析 XML 文件?

    2024-07-12 10:30:02       21 阅读
  2. VSCode中多行文本的快速前后缩进

    2024-07-12 10:30:02       20 阅读
  3. [手机Linux PostmarketOS]三, Alpine Linux命令使用

    2024-07-12 10:30:02       23 阅读
  4. Vscode连接存在私钥的远程服务器

    2024-07-12 10:30:02       25 阅读
  5. leetcode热题100.单词拆分(动态规划进阶)

    2024-07-12 10:30:02       27 阅读
  6. ubuntu文件夹加密

    2024-07-12 10:30:02       23 阅读
  7. OpenCV在构建时确实没有启用CUDA支持

    2024-07-12 10:30:02       20 阅读
  8. 编程题-函数模板

    2024-07-12 10:30:02       22 阅读
  9. Opencv中的直方图均衡

    2024-07-12 10:30:02       20 阅读
  10. cannot connect to X server

    2024-07-12 10:30:02       22 阅读