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

mysql大表的深度分页慢sql案例(跳页分页)

1 背景

有一张表,内容是 redis缓存中的key信息,数据量约1000万级,

expiry列上有一个普通B+树索引。

-- test.top definitionCREATE TABLE `top` (`database` int(11) DEFAULT NULL,`type` varchar(50) DEFAULT NULL,`key` varchar(500) DEFAULT NULL,`size_in_bytes` varchar(50) DEFAULT NULL,`encoding` varchar(50) DEFAULT NULL,`num_elements` int(11) DEFAULT NULL,`len_largest_element` varchar(50) DEFAULT NULL,`expiry` varchar(50) DEFAULT NULL,`idid` int(11) DEFAULT NULL,KEY `top_key_IDX` (`key`) USING BTREE,KEY `top_expiry_IDX` (`expiry`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们的需求是按照expiry进行降序排序,分页查询10条数据,当执行的页码比较深pageNo=25000页时,就会出现深度分页问题。

1.1 原始深度分页sql

 select * from top order by expiry  desc limit  250000,10;

 深度分页会引起索引失效,走全表扫描的现象 。

1.2 原始深度分页sql执行耗时

共耗时 1m24s

 

 

 2、解决方案

2.1 优化之后sql

select * from top where expiry <= (select expiry from top  order by expiry desc     limit 250000,1 )order by expiry desc  limit  1,10;

充分利用索引覆盖的特性,扫描索引结构,避免全表扫描。

注意事项:

1、mysql在子查询中是不支持这个order by limit的除了,limit 1,只返回单条数据这个是支持的;

 2.2 优化之后sql执行耗时

328ms 

3、总结

     深度分页往往会带来全表扫描查询慢的问题,我们一定要分析执行计划,要么利用连续分页特性解决问题、要么利用索引扫描来解决问题。 

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

相关文章:

  • 集中/本地转发、AC、AP
  • Spring集成Seata
  • 三种方式创建对象的几种方式及new实例化时做了什么?
  • vue2-vue实例挂载的过程
  • C++ 右值引用案例
  • 2.文件的逻辑结构
  • 20天学rust(一)和rust say hi
  • 牢记这16个SpringBoot 扩展接口,写出更加漂亮的代码
  • c++两种设计模式 单例和工厂模式
  • 2023-08-05——JVM 栈
  • Camera之PhysicalCameraSettingsList/SurfaceMap/CameraMetadata/RequestList的关系(三十二)
  • 【ONE·Linux || 基础IO(二)】
  • 【LeetCode 算法】Power of Heroes 英雄的力量
  • 合宙Air724UG LuatOS-Air script lib API--ntp
  • LangChain+ChatGLM大模型应用落地实践(一)
  • PSO粒子群优化算法
  • 记一次 .NET某医疗器械清洗系统 卡死分析
  • C# 基于Rijndael对文件进行加解密
  • Elasticsearchr入门
  • 【ARM】imx6ul移植kernel记录,恩智浦github提供的最新kernel(2023年7月31)
  • eeglab(自用)
  • Dockerfile构建Tomcat镜像(源码)
  • Frida Error: getPackageInfoNoCheck(): has more than one overload的解决方法
  • flutter开发实战-RawKeyboardListener监听键盘事件及keycode。
  • Temu、希音们全托管引争议,跨境电商应变“工贸一体化”
  • 某科技公司提前批测试岗
  • 一次redis缓存不均衡优化经验
  • npm发布包
  • Qt5.13引入QtWebApp的模块后报错: error C2440: “reinterpret_cast”: 无法从“int”转换为“quintptr”
  • 软件为什么要进行性能压力测试?