专栏名称: 程序员鱼皮
鹅厂全栈开发,持续分享编程技法和实用项目
今天看啥  ›  专栏  ›  程序员鱼皮

半夜被慢查询告警吵醒,limit深度分页的坑

程序员鱼皮  · 公众号  ·  · 2024-10-14 13:30

主要观点总结

文章讲述了小猫在使用分页查询时遇到的慢查询问题,并分析了使用limit分页时为什么会出现慢查询的原因。同时,提供了多种优化分页查询的方法,包括使用子查询法、使用inner join方式进行优化、标签记录法(锚点记录法)以及存入到es中的解决方案。

关键观点总结

关键观点1: 故事背景

小猫今天在下班之前上线了一个版本,由于新增了一个业务字段,所以写了相关的刷数据的接口。由于数据量较大,使用了分页查询,但出现了慢查询问题。

关键观点2: 问题分析

文章分析了使用limit分页时为什么会出现慢查询的原因,是因为在执行深度分页时,需要频繁回表查询,导致无用回表次数过多,从而降低了查询效率。

关键观点3: 解决方案

文章提供了多种优化分页查询的方法,包括使用子查询法、使用inner join方式进行优化、标签记录法(锚点记录法),以及将数据存储到es中的解决方案。每种方法都详细阐述了其原理和使用方式,以及需要注意的地方。

关键观点4: 小猫的优化方式

小猫采用了inner join的优化方法,通过内连接查询优化深度分页的效率。


文章预览

故事 小猫今天在下班之前上线了一个版本,由于新增了一个业务字段,所以小猫写了相关的刷数据的接口,在下班之前调用开始刷历史数据。 考虑到表的数据量比较大,一次性把数据全部读取出来然后在内存里面去刷新数据肯定是不现实的,所以小猫采用了分页查询的方式依次根据条件查询出结果,然后进行表数据的重置。没想到的是,数据量太大,分页的深度越来越深,渐渐地,慢查询也就暴露出来了。 慢查询告警 那么为什么用使用limit之后会出现慢查询呢?接下来老猫和大家一起来剖析一下吧。 剖析流程 limit分页为什么会变慢? 在解释为什么慢之前,咱们来重现一下小猫的慢查询场景。咱们从实际的例子推进。 做个小实验 假设我们有一张这样的业务表,商品Product表。具体的建表语句如下: CREATE TABLE `Product` (   `id` bigint(20) unsigned NOT ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览