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

MySQL深分页问题

在项目中有一个数据导出的需求,原来的实现方式也比较简单,根据查询条件分页查所有的数据,然后转成csv的格式一行一行写进文件存储中。

实际上线之后,发现出现了慢查询,具体的sql如下:

select * from table_name
WHERE create_time > "2025-04-11 00:00:00" and create_time < "2025-04-12 23:59:59.999"
order by create_time limit offset, size;

第一次出现的时候也没多想,发现create_time没加索引,就给create_time加了索引,以为从此万事大吉。

没想到,今天又出现了慢查询。纳尼,这还能忍?

于是乎,常规操作,执行了一下explain,竟然意外的发现,当请求的页码深度超过一定程度以后,create_time索引就被放弃了,改为全表扫描了。

因此二级索引在使用的时候,一般是需要再次进行回表进行查询的,所以当分页深度超过一定程度,优化器会认为成本太高直接改为全表扫描。

关于MySQL可能造成索引失效的一些情况,可以参考下面这篇文章。

https://juejin.cn/post/7300460850011734070?spm=a2c6h.12873639.article-detail.4.45c5438eRjVDEU

在知道了原因之后,头脑一热,心想这还不简单吗,force index了解一下?

使用force index虽然可以解决索引失效的问题,但是因为页码深度的问题造成的回本成本过高的问题也是实际存在的,那么有没有更好的解决方案呢?

还真有,这里之所以使用传统limit offset,size方式进行分页查询,实际上是掉进了一个思维陷阱里,因为这是使用最多的分页查询方式。但是考虑到此处的场景并不需要真正的分页,只需要能达到分批获取数据的逻辑就可以了。

所以最终的解决方案是使用id > xxx limit 100这样的方式来实现。

select * from table_name
WHERE create_time > "2025-04-11 00:00:00" and create_time < "2025-04-12 23:59:59.999" and id > xxx limit 100;

相关文章:

  • 【Code】《代码整洁之道》笔记-Chapter11-系统
  • Cuto壁纸 2.6.9 | 解锁所有高清精选壁纸,无广告干扰
  • 单细胞多组学及空间组学数据分析与应用
  • 《系统分析师-浏览试卷(一)总结》
  • 元生代品牌建设:平台实现工作流(comfyui)创建与技术文档说明
  • CVE-2025-32375 | Windows下复现 BentoML runner 服务器远程命令执行漏洞
  • JavaScript:基本语法
  • 电脑的usb端口电压会大于开发板需要的电压吗
  • 【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘
  • ai-warp 开源的Platformatic Stackable 与 AI 服务交互
  • 快速idea本地和推送到远程仓库
  • .net 使用笔记
  • 【DDR 内存学习专栏 1. -- DDR 内存带宽与 CPU 速率】
  • 【Hadoop入门】Hadoop生态之Oozie简介
  • windows sc 创建删除服务
  • Java设计模式之享元模式:从入门到架构级实践
  • 断链保护装置常见故障及解决方法
  • 关于freertos的heap_4分配内存的方式以及首次适应算法
  • 【Docker】快速部署 Certbot 并为 Nginx 服务器配置 SSL/TLS 证书
  • AI反检测如何在TikTok养号中发挥关键作用?
  • 石家庄模板建站系统/国际新闻最新消息2022
  • 华为云建站和阿里云建站区别/无限制搜索引擎排名
  • 怎么做自己网站/b站推广网站入口
  • 丽水做企业网站的地方/潍坊百度网站排名
  • 冠县网站开发/免费做网页的网站
  • 苏州做网站公司/seo外包公司排名