多线程MySQL分页查询-性能优化

news/2024/11/8 0:00:13/

MySQL分页查询优化

  • 一、背景
  • 二、原因
  • 三、解决
  • 四、原理探究

https://blog.csdn.net/hollis_chuang/article/details/130570281

总结:
在这里插入图片描述

一、背景

  • 业务背景:给C端10万级别的用户,同时发送活动消息,活动消息分为6类。
  • 数据背景:mysql表有百万级别的数据量。
  • 问题:每次发活动消息时,数据库占用过高

在这里插入图片描述

二、原因

在这里插入图片描述
看sql日志记录,明显看出有两个问题:

  • 1 深分页
  • 2 查询条件执行了两次

explain下
在这里插入图片描述
type类型为 ref
在这里插入图片描述

三、解决

  • 原sql
select * from channel_subscribe_relation
where external_channel=9 
and template_id = "rf2624--esUKD3O5B1Qxfe15qbfAQugk-JpFVUf55BU"
and subscribe_status=1
order by id ASC
LIMIT 50000,10
  • 优化sql
SELECT * FROM channel_subscribe_relation
WHERE external_channel = 9 AND template_id = "dafdjlfanfdaln"AND subscribe_status = 1AND id > [Last_Page_Last_Id]
ORDER BY id ASC
LIMIT 10;

测试结果:

  • 原sql: 平均 0.1s级别

  • 优化sql:平均0.004 s

SELECT * FROM channel_subscribe_relation
WHERE external_channel = 9 AND template_id = "rNdk87qpBKQstZpx4hL0u1-kMCrF3phit-ySUOOt_8I"AND subscribe_status = 1AND id > 244567
ORDER BY id ASC
LIMIT 10;

在这里插入图片描述综上所述,使用主键id索引替换分页查询 ,查询性能:缩短了近 25 倍。

但是,问题并没有解决!因为代码是多线程去查库的,我并不知道上次上传的 最后一页的最后一个主键id是多少!

所以,只能另辟蹊径。

经过百度,还可以通过 通过子查询优化

  • 1 把条件转移到主键索引树
  • 2- NNER JOIN 延迟关联

SELECT *
FROM channel_subscribe_relation
WHERE id >= (
SELECT c.id
FROM channel_subscribe_relation c
WHERE c.external_channel = 9
AND c.template_id = “rf2624–esUKD3O5B1Qxfe15qbfAQugk-JpFVUf55BU”
AND c.subscribe_status = 1
ORDER BY c.id ASC
LIMIT 50000, 1
)
AND external_channel = 9
AND template_id = “rf2624–esUKD3O5B1Qxfe15qbfAQugk-JpFVUf55BU”
AND subscribe_status = 1
ORDER BY id ASC
limit 10

0.05s

进一步优化:

SELECT * FROM channel_subscribe_relation
WHERE id IN (
SELECT id
FROM (
SELECT c.id
FROM channel_subscribe_relation c
WHERE c.external_channel = 9
AND c.template_id = “rf2624–esUKD3O5B1Qxfe15qbfAQugk-JpFVUf55BU”
AND c.subscribe_status = 1
ORDER BY c.id ASC
LIMIT 50000, 10
) AS t
);

四、原理探究

TODO


http://www.ppmy.cn/news/1059906.html

相关文章

Mybatis-plus中操作JSON字段

1.实体类上要加上自动映射 TableName(value "school", autoResultMap true)2.json字段上加上json处理器 TableField(value "cover_url", typeHandler JacksonTypeHandler.class)private List<String> cover_url;参考博客 http://www.dedeyun.co…

JAVA坦克大战游戏v3

JAVA坦克大战游戏v3 素材 bomb_3.gif bomb_2.gif bomb_1.gif 项目结构 游戏演示 MyTankGame3.java /*** 功能:坦克游戏的5.0[]* 1.画出坦克.* 2.我的坦克可以上下左右移动* 3.可以发射子弹,子弹连发(最多5)* 4.当我的坦克击中敌人坦克时&#xff0c;敌人就消失(爆炸的效…

亿赛通电子文档安全管理系统 RCE漏洞

亿赛通电子文档安全管理系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测: 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失…

springboot向resources下写文件的两种方式

文章目录 方式一&#xff1a;方式二&#xff1a; 方式一&#xff1a; import java.io.File; import java.io.FileWriter; import java.io.IOException;public class WriterFileUtils {private static final String prefix "classpath:";public static void writeFi…

Android 之 AlarmManager (闹钟服务)

本节引言&#xff1a; 本节带来的Android中的AlarmManager(闹钟服务)&#xff0c;听名字我们知道可以通过它开发手机闹钟类的APP&#xff0c; 而在文档中的解释是&#xff1a;在特定的时刻为我们广播一个指定的Intent&#xff0c;简单说就是我们自己定一个时间&#xff0c; 然后…

Spring cache整合Redis使用介绍

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

vue3 基础知识 ( webpack 基础知识)05

你好 文章目录 一、组件二、如何支持SFC三、webpack 打包工具四、webpack 依赖图五、webpack 代码分包 一、组件 使用组件中我们可以获得非常多的特性&#xff1a; 代码的高亮&#xff1b;ES6、CommonJS的模块化能力&#xff1b;组件作用域的CSS&#xff1b;可以使用预处理器来…

什么是Spring框架?Spring有什么优势?Spring核心模块有哪些?

简介 Spring 是一个以 IoC 和 AOP 为基础的Java EE轻量级开源框架&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。 广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spr…