美文网首页sql优化
sql深度分页优化方案

sql深度分页优化方案

作者: 饱饱想要的灵感 | 来源:发表于2024-03-23 15:56 被阅读0次

假设我们有一个user表,数量级千万,有id,name,create_time等字段,要根据create_time深度分页

先创建create_time的索引,然后,普通的查询方式是:

select * from user where 1=1 limit 100000,20;

但这种方式查询效率慢, 原因有二:

  1. limit语句会先扫描offset+pageSize行,然后再丢弃掉前offset行,返回后pageSize行数据,offset越大,查询越耗时 。
  2. create_time是非聚簇索引,需要先查询出主键ID,再回表查询,通过主键ID查询出所有字段。
    关于聚簇索引的概念看聚簇索引和非聚簇索引

因此需进一步优化。

一、子查询

我们可以先用子查询查出符合条件的主键,再用主键ID做条件查出所有字段。示例代码如下:

SELECT * FROM user WHERE id IN (
    SELECT id FROM user WHERE create_time>'2022-07-03' LIMIT 100000,10
);

不过,这种查询会报错,说是子查询中不支持使用limit。没关系,我们可以加一层子查询嵌套,就可以解决这个问题。示例代码如下:

SELECT * FROM user WHERE id IN (
  SELECT id FROM (
    SELECT id FROM user WHERE create_time>'2022-07-03' LIMIT 100000,10
  ) AS t
);

为什么先用子查询查出符合条件的主键ID,就能缩短查询时间呢?这是因为子查询用到了覆盖索引,无需回表查询,从而加快了查询效率。

二、inner join关联查询

我们可以把子查询的结果当成一张临时表,然后和原表进行关联查询。示例代码如下:

SELECT * FROM user INNER JOIN (
  SELECT id FROM user WHERE create_time>'2022-07-03' LIMIT 100000,10
) AS t ON user.id=t.id;

三、使用分页游标

具体的实现方式是:当我们查询第二页的时候,把第一页的查询结果放到第二页的查询条件中。例如,我们首先查询第一页:

SELECT * FROM user WHERE create_time>'2022-07-03' LIMIT 10;

然后,查询第二页,把第一页的查询结果的最大id放到第二页查询条件中:

SELECT * FROM user WHERE create_time>'2022-07-03' AND id>10 LIMIT 10;

这样,相当于每次都是查询第一页,也就不存在深分页的问题了。不过,这种查询方式无法跳转到指定页数,只能一页页向下翻。所以,这种查询只适合特定场景,比如新闻APP的首页。

相关文章

  • Oracle SQL优化学习

    Oracle SQL优化进阶学习 引言 对于下面的Oracle分页如何优化该段语句: SELECT * FROM ...

  • 2021-01-16 - mysql优化

    分页优化 表结构如下 根据主键的查询排序 sql查询 会用到索引吗? 非主键的排序分页查询 sql查询 会用到索引...

  • 64MySQL-分页查询&表连接&count统计&索引优化总结

    1 Mysql 分页查询sql 执行原理? 2,千万级数据mysql 分页查询如何优化 3,Mysql表连接底层实...

  • 分库分表第四篇之分页查询优化方案

    Sharding-Jdbc分页修正Sharding-Jdbc分页修正的优化方案 分页查询在一个系统中一般都是占据了...

  • Java面试题:数据库优化策略有哪些?

    1、Sql优化主要优化的还是查询, 优化查询的话, 索引优化是最有效的方案。 首先要根据需求写出结构良好的SQL,...

  • MySQL优化

    数据库SQL优化大总结之 百万级数据库优化方案

  • mysql深入篇

    目录 优化篇 学习 优化 慢查询优化,我终于在生产踩到了这个坑!! 学习 数据量很大,分页查询很慢,有什么优化方案...

  • 分页SQL

    分页 rownum,rowid 分页SQL

  • SQL优化方案

    好久没有写东西了,最近在接触Java的项目,感觉自己真的懂的太少,要学的知识太多,刚开始感觉只要可以完成一个接口就...

  • mysql深度分页优化

    1. 背景 Mysql使用select * from table limit offset, rows分页在深度分...

网友评论

    本文标题:sql深度分页优化方案

    本文链接:https://www.haomeiwen.com/subject/chtktjtx.html