首页 > 数据库 >SQL优化之--用户R值初始化

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

时间:2024-12-15 22:43:06浏览次数:8  
标签:初始化 code -- brand sql user SQL 数据 id

在做一件什么事情:

对新用户创建一个账号。如果用户账户已经存在,则对该账户的余额进行增减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左右。

标签:初始化,code,--,brand,sql,user,SQL,数据,id
From: https://www.cnblogs.com/euler-blog/p/18608849

相关文章

  • webrtc && aiortc
    WebRTC_APIhttps://developer.mozilla.org/en-US/docs/Web/API/WebRTC_APIWebRTC(WebReal-TimeCommunication)isatechnologythatenablesWebapplicationsandsitestocaptureandoptionallystreamaudioand/orvideomedia,aswellastoexchangearbitra......
  • 余弦相似度Cosine Sim
    what余弦相似度是一种用于度量向量相似性的metric。\[cos\theta=\frac{A.B}{|A|.|B|}\]A.B:向量的内积|A|:向量的模长\(cos\theta\):的范围$[-1,1]$why余弦相似度的计算复杂度很低,对于稀疏向量而言,只用考虑非零向量Hownumpy实现importnumpyasnpdefcosine_s......
  • MX J-10 做题记录
    Ahttps://cspjs.online/contest/264/problem/1我们猜测出一定这个数一定要为\(2^t\)答案才最优。因为\(2l\ler\),所以\([l,r]\)区间中一定有一个\(2\)的整数次幂,枚举即可。#include<bits/stdc++.h>usingnamespacestd;inlinevoidsolve(){ intl,r,x; cin>>l>>r;......
  • Day32-JavaEE应用&Servlet路由技术&UDBC&Mybatis数据库&生命周期
    一,Servlet&路由&周期1,Servlet的含义:Servlet是运行在web服务器或应用服务器上的程序,它是作为来自web浏览器或其他HTTP客户端请求和HTTP服务器上的数据库或应用程序的中间件。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页2.Servl......
  • 2024-2025-1 20241406刘书含第十二周学习总结
    文件类型与存储方式文本文件文本文件是基于字符编码(如ASCII或UTF-8)存储的文件。在文本文件中,每个字符都有对应的编码值。例如,字符'A'在ASCII码中对应的十进制值是65。当使用文本编辑器打开文本文件时,会将这些编码值转换为可识别的字符显示出来。文本文件的内容可以被人类直接......
  • DataGrip: MySQL数据库图形化开发工具
    一、DataGrip介绍DataGrip是JetBrains公司推出的管理数据库的产品,功能非常强大,可以兼容各种数据库,另外,JetBrains公司还有一款知名的IDE开发工具IDEA,用户体验非常不错。下载地址https://www.jetbrains.com/datagrip/download/#section=windows二、DataGrip安装下载完成后打......
  • .Net_比对Json文件是否一致
    简介该方法用于比较两个Json文件是否完全一致,仅考虑内容若两个文件中的内容只是顺序不一致,内容是一样的,那么也代表这两个文件是相等的实现代码调用usingCompareJsonFiles;Console.WriteLine("=================输入信息===================");Console.WriteLi......
  • 2024-2025-1 20241408陈烨南《计算机基础与程序设计》第十二周学习总结
    2024-2025-120241408陈烨南《计算机基础与程序设计》第十一周学习总结这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标无作业正文本博客链接教材学习内容总......
  • 综合设计——多源异构数据采集与融合应用综合实践
    综合设计——多源异构数据采集与融合应用综合实践这个项目属于哪个课程2024数据采集与融合技术实践组名、项目简介组名:味谱魔方、项目需求:设计出一个交互友好的多源异构数据的采集与融合的小应用、项目目标:本系统旨在实现用户将食品加入购物车,生成对应的食谱核心功......
  • comfyui
    comfyui配置和部署硬件需求GPU:4G显存nvidia显卡CPU:intel13代i5内存:16G硬盘:200G固态下载github:GitHub-comfyanonymous/ComfyUI:ThemostpowerfulandmodulardiffusionmodelGUI,apiandbackendwithagraph/nodesinterface.官网:ComfyUI|Generatevideo,ima......