当前位置: 首页 > MySQL数据库

如何解决mysql深分页问题

时间:2026-01-27 10:38:03

日常需求开发过程中,相信大家对于limit一定不会陌生,但是使用limit时,当偏移量(offset)非常大时,会发现查询效率越来越慢。一开始limit 2000时,可能200ms,就能查询出需要的到数据,但是当limit 4000 offset 100000时,会发现它的查询效率已经需要1S左右,那要是更大的时候呢,只会越来越慢。

概括

本文将会讨论当mysql表大数据量的情况,如何优化深分页问题,并附上最近的优化慢sql问题的案例伪代码。

1、limit深分页问题描述

先看看表结构(随便举了个例子,表结构不全,无用字段就不进行展示了)

CREATETABLE`p2p_detail_record`(`id`varchar(32)COLLATEutf8mb4_binNOTNULLDEFAULT''COMMENT'主键',`batch_num`intNOTNULLDEFAULT'0'COMMENT'上报数量',`uptime`bigintNOTNULLDEFAULT'0'COMMENT'上报时间',`uuid`varchar(64)COLLATEutf8mb4_binNOTNULLDEFAULT''COMMENT'会议id',`start_time_stamp`bigintNOTNULLDEFAULT'0'COMMENT'开始时间',`answer_time_stamp`bigintNOTNULLDEFAULT'0'COMMENT'应答时间',`end_time_stamp`bigintNOTNULLDEFAULT'0'COMMENT'结束时间',`duration`intNOTNULLDEFAULT'0'COMMENT'持续时间',PRIMARYKEY(`id`),KEY`idx_uuid`(`uuid`),KEY`idx_start_time_stamp`(`start_time_stamp`)//索引,)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_binCOMMENT='p2p通话记录详情表';

假设我们要查询的深分页SQL长这样

select*fromp2p_detail_recordppdrwhereppdr.start_time_stamp>1656666798000limit0,2000

查询效率是94ms,是不是很快?那如果我们limit 100000,2000呢,查询效率是1.5S,已经非常慢,那如果更多呢?

2、sql慢原因分析

让我们来看看这条sql的执行计划

也走到了索引,那为什么还是慢呢?我们先来回顾一下mysql 的相关知识点。

聚簇索引和非聚簇索引

聚簇索引: 叶子节点储存的是整行的数据。

非聚簇索引: 叶子节点储存的是整行的数据对应的主键值。

使用非聚簇索引查询的流程

  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素