SQL优化之--用户R值初始化

news/2024/12/15 22:37:07/文章来源:https://www.cnblogs.com/euler-blog/p/18608849

在做一件什么事情:

对新用户创建一个账号。如果用户账户已经存在,则对该账户的余额进行增减update操作。如果用户账户不存在,创建一个新的账户。并对用户账户明细表进行记录。

对要插入的数据和系统中已经存在的数据取交集,然后与要插入的数据取补给,所得数据就是要插入系统中的新的用户数据。

遇到了什么问题:

在本地模拟了上线操作脚本的场景,当时模拟的数据是30W+的用户数据,然后mysql实际配置是本地笔记本的配置信息,发现sql执行有点慢,担心上线时会对线上用户造成影响,所以本地排查,定位一下问题。

点击查看代码
insert into brand_value_record (
brand_record_id,
source_record_id,
brand_code,
code_id,
brand_code_value,
in_or_out,
user_id,
period_type,
period_start,
period_end,
operate_time,
operator_name,
source,
value_type,
remark,
is_delete) 
SELECT 
CONCAT(DATE_FORMAT(NOW(),"%Y%m%d%H%i%s"),CAST(round(rand() * 10000000) as CHAR)), # 记录流水
CONCAT(DATE_FORMAT(NOW(),"%Y%m%d%H%i%s"),CAST(round(rand() * 10000000) as CHAR)), # 源记录号
4,                                                                 # 固定值 4 代表R
'Register_20210530',                                               # 固定 code_id
1,                                                                 # 增加B值 11
1,                                                                 # 表示增加
m.user_id,                                                           # 对应账户
1,                                                                 # 有效类型 方式
current_date,                                                      # 有效期起,
DATE_ADD(current_date, INTERVAL 1 YEAR),                           # 有效期终
current_timestamp,                                                 # 记录操作时间
'sys_0610',                                                        # 操作人标识
'sql_into',                                                        # 数据来源
'B',                                                               # 类型标识
'用户注册送1R值',                                                        # 备注信息
0                                                                  # 是否删除(0未删除)
from tmp_recommend_buy as m 
where not EXISTS (select s.user_id from brand_value_total as s where m.user_id=s.user_id and brand_code=4) GROUP BY user_id;
**发现执行的sql非常的慢**

问题分析:

select对象是一个子查询,子查询中包含not exists 语句,并且该语句需要对导入的数据进行分组,exists 关联条件中讲道理是应该用到了user_id索引的,但是通过explain发现该sql是通过走索引进行了全表扫描。索性,这里没有进行回表查询。但是整个语句很慢,实际上tmp_recommend_buy只有一千多条数据。

优化过程

  1. 查看系统中是否有线程执行语句存在锁表情况
    show full processlist;
  2. 执行前面的慢查询语句
点击查看代码
SELECT 
CONCAT(DATE_FORMAT(NOW(),"%Y%m%d%H%i%s"),CAST(round(rand() * 10000000) as CHAR)), # 记录流水
CONCAT(DATE_FORMAT(NOW(),"%Y%m%d%H%i%s"),CAST(round(rand() * 10000000) as CHAR)), # 源记录号
4,                                                                 # 固定值 4 代表R
'Register_20210530',                                               # 固定 code_id
1,                                                                 # 增加B值 11
1,                                                                 # 表示增加
m.user_id,                                                           # 对应账户
1,                                                                 # 有效类型 方式
current_date,                                                      # 有效期起,
DATE_ADD(current_date, INTERVAL 1 YEAR),                           # 有效期终
current_timestamp,                                                 # 记录操作时间
'sys_0610',                                                        # 操作人标识
'sql_into',                                                        # 数据来源
'B',                                                               # 类型标识
'用户注册送1R值',                                                        # 备注信息
0                                                                  # 是否删除(0未删除)
from tmp_recommend_buy as m 
where not EXISTS (select s.user_id from brand_value_total as s where m.user_id=s.user_id and brand_code=4) GROUP BY user_id;
3. 在profiles中找到刚才执行的查询ID `show profiles;` 4. 查看该ID对应的各个阶段的性能消耗,执行一下sql查看对应的性能消耗过程 `show profile all for query 1;` 5. 可以看到主要消耗时间的操作时在sending data 阶段。于是,又针对sending data 阶段有进一步的探索。

Sending Data具体做什么

sending data 包含两个阶段。

1.收集数据阶段

mysql 使用索引检索到数据以后得到的都是主键ID,如果有的列不在索引中,还要对数据回表取数据

2.发送数据阶段

获取到数据后才是返回数据阶段

最后的结论

1.查询的过程中使用到了索引
2.整个sql的响应时间变慢的主要原因是回表查询了数据&&发送数据量大

优化措施

没有进行优化操作,原因如下:
1.因为查询已经走了索引,索引方面是没法再优化了
2.因为这个sql是在新的服务上线的时候,初始化的脚本,数据量大,执行过程长是必然现象
3.本地笔记本配置有限,实际线上mysql配置16C32G
4.服务发布时间点靠后

实际效果

实际线上执行时间20s左右,本地执行35s左右。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853513.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataGrip: MySQL数据库图形化开发工具

一、DataGrip介绍 DataGrip是JetBrains公司推出的管理数据库的产品,功能非常强大,可以兼容各种数据库,另外,JetBrains公司还有一款知名的IDE开发工具IDEA,用户体验非常不错。 下载地址 https://www.jetbrains.com/datagrip/download/#section=windows二、DataGrip安装 下载…

2024-2025-1 20241408陈烨南《计算机基础与程序设计》第十二周学习总结

2024-2025-1 20241408陈烨南《计算机基础与程序设计》第十一周学习总结这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标 无作业正文 本博客链接教材学习内容总结 一、指针与数…

2025年知识库趋势:AI工具引领变革

随着数字化转型的深化,企业内部知识库已成为推动企业创新、提升团队协作效率的核心要素。展望2025年,企业内部知识库将呈现出哪些新趋势?AI工具又将如何在这场变革中发挥引领作用?本文旨在探讨这些问题,为企业构建未来知识管理战略提供参考。一、2025年知识库新趋势 智能化…

SkiaSharp部署到Linux不工作,提示libSkiaSharp.so找不到的解决办法

Nuget安装下面的包即可解决,SkiaSharp.NativeAssets.Linux.NoDependecies

403绕过神器: 4-ZERO-3

免责声明 本公众号分享的安全工具和项目均来源于网络,仅供学术交流,请勿直接用于任何商业场合和非法用途。如用于其它用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。介绍 4-ZERO-3 工具可绕过 403/401。此脚本包含所有可能的技术来实现相同的目的。 注意…

拉格朗日插值和数值微积分

+++ date = 2024-11-30T15:26:27+08:00 draft = true title = 拉格朗日插值和数值微积分 +++ 初次发布于我的个人文档。(每次都是个人文档优先发布哦) 本文想简要介绍和推导一下拉格朗日插值和数值积分方法。 什么是插值? 所谓的插值就是已知几个离散点的信息视图求一个满足…

linux之slb四层负载(lvs)

负载均衡-动静分离slb四层负载LVS(Linux Virtual Server) 是一个开源的负载均衡解决方案,运行在 Linux 操作系统上,用于在多个后端服务器之间分配客户端的请求,从而实现高可用性和负载均衡。它通常用于大规模网站、应用程序和微服务的架构中,适用于高并发场景,以提高系统…

CLion配置cout打印语句快捷键

点击菜单栏的 File -> Settings->Editor -> Live Templates 点击 Define,选择 C++。 点击Apply 和 OK 保存。 当我们sout时,自动出现打印语句。 本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18608801,如有侵权…

域名信息

引子:上一章介绍了服务器的信息收集。本篇则介绍在面对存在Web资产企业时,其域名信息该如何收集。附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.1 域名信息引子:上一章介绍了服务器的信息收集。本篇则介绍在面对存在Web资产企业时,其…

Go单体服务开发最佳实践

转: https://www.cnblogs.com/kevinwan/p/16193504.html ------------------------------------------------------------------------------------------ 单体最佳实践的由来对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,并且此时用户体量也很小,QPS 也…

Adobe Bridge 2025下载与安装

1、安装包 我用夸克网盘分享了「Bridge 2025」 链接:下载地址 2、安装教程(安装前关闭系统防护) 1) 下载软件安装包,双击Set-up.exe安装2) 修改安装目录,点击继续3) 点击继续,提示正在安装进度4) 安装完成,点击启动5) 启动程序

fastapi本地部署,网页调用

Fastapi本地部署: 1、启动main.py。 文件test_main.http,点击3处运行,运行接口报错: Response code: 504 (Gateway Time-out); Time: 10032ms (10 s 32 ms); Content length: 101929 bytes (101.93 kB)2、文件main.py运行。 在浏览器输入:http://10.58.71.144:8000/ 。 打…