insert into select 迁移数据,可以嘛?

1 事情的起因
公司的交易量比较大,使用的数据库是mysql,每天的增量差不多在百万左右,公司并没有分库分表,所以想维持这个表的性能只能考虑做数据迁移。

同事李某接到了这个任务,于是他想出了这两个方案

先通过程序查询出来,然后插入历史表,再删除原表
使用insert into select让数据库IO来完成所有操作
第一个方案使用的时候发现一次性全部加载,系统直接就OOM了,但是分批次做就过多io和时间长,于是选用了第二种方案

2 到底发生了啥,我们复盘一下
先来看第一个方案,先看伪代码

// 1、查询对应需要迁移的数据
List<Object> list = selectData();// 2、将数据插入历史表
insertData(list);// 3、删除原表数据
deleteByIds(ids);

我们可以从这段代码中看到,OOM的原因很简单,我们直接将数据全部加载内存,内存不爆才怪。

再来看看第二个方案,到底发生了啥
为了维持表的性能,同时保留有效数据,经过商量定了一个量,保留10天的数据,差不多要在表里面保留1kw的数据。所以同事就做了一个时间筛选的操作,直接insert into select … dateTime < (Ten days ago),爽极了,直接就避免了要去分页查询数据,这样就不存在OOM啦。还简化了很多的代码操作,减少了网络问题。

为了测试,还特意建了1kw的数据来模拟,测试环境当然是没有问题啦,顺利通过。考虑到这个表是一个支付流水表,于是将这个任务做成定时任务,并且定在晚上8点执行。

晚上量也不是很大,自然是没有什么问题,但是第二天公司财务上班,开始对账,发现资金对不上,很多流水都没有入库。最终排查发现晚上8点之后,陆陆续续开始出现支付流水插入失败的问题,很多数据因此丢失。

最终定位到了是迁移任务引起的问题,刚开始还不明所以,白天没有问题,然后想到晚上出现这样的情况可能是晚上的任务出现了影响,最后停掉该任务的第二次上线,发现没有了这样的情况。

3 复盘
问题在哪里?
为什么停掉迁移的任务之后就好了呢?这个insert into select操作到底做了什么?我们来看看这个语句的explain。

我们不难从图中看出,这个查询语句直接走了全表扫描。这个时候,我们不难猜想到一点点问题。如果全表扫描,我们这个表这么大,是不是意味着迁移的时间会很长?假若我们这个迁移时间为一个小时,那是不是意味着就解释了我们白天没有出现这样问题的原因了。但是全表扫描是最根本的原因吗?

我们不妨试试,一边迁移,一边做些的操作,还原现场。最终还是会出现这样的问题。这个时候,我们可以调整一下,大胆假设,如果不全表扫描,是不是就不会出现这样的问题。当我们将条件修改之后,果然发现没有走了全表扫描了。最终再次还原现场,问题解决了

得出结论:全表扫描导致了这次事故的发生。

这样做就解决了发生的问题,但是做为陆陆续续开始失败这个就不好解释了。

原因
在默认的事务隔离级别下:insert into a select b的操作a表示直接锁表,b表是逐条加锁。这也就解释了为什么出现陆续的失败的原因。在逐条加锁的时候,流水表由于多数是复合记录,所以最终部分在扫描的时候被锁定,部分拿不到锁,最终导致超时或者直接失败,还有一些在这加锁的过成功成功了。

为什么测试没有问题?
在测试的时候充分的使用了正式环境的数据来测试,但是别忽视一个问题,那就是测试环境毕竟是测试环境,在测试的时候,数据量真实并不代表就是真实的业务场景。比方说,这个情况里面就少了一个迁移的时候,大量数据的插入这样的情况。最终导致线上bug

4 解决办法
既然我们避免全表扫描就可以解决,我们避免它就行了。想要避免全表扫描,对where后面的条件做索引,让我们的select查询都走索引即可

5 insert into还能用吗?
可以

6 总结
使用insert into select的时候请慎重,一定要做好索引

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

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

相关文章

Vue 路由:一级路由,嵌套路由

1、安装路由插件,因为用的是vue2 所以路由版本要和vue2对应上&#xff0c;所有有3 yarn add vue-router3 2、在main.js里引入 import VueRouter from vue-router Vue.use(VueRouter) 3、新建文件夹 router,创建index.js 4、引入路由插件&#xff0c;并且暴露出来这个路由 5、在…

在 JavaScript 中,如何给js对象增加新的属性和值

在 JavaScript 中&#xff0c;如何给js对象增加新的属性和值&#xff0c;可以使用点符号&#xff08;.&#xff09;和方括号符号&#xff08;[]&#xff09;&#xff0c;但是他们的用法有一些关键的区别&#xff0c;具体如下&#xff1a; 点符号. 点符号用来添加对象的属性&a…

基于机器学习的C-MAPSS涡扇发动机RUL预测

美国国家航空航天局的商用模块化航空推进仿真系统&#xff08;CMAPSS&#xff09;所模拟出的涡扇发动机性能退化数据进行实验验证&#xff0c;数据中包含有风扇、涡轮、压气机等组件参数。C-MAPSS中所包含的数据集可以模拟出从海平面到42千英尺的高度&#xff0c;从0到0.9马赫的…

一键实现电脑投屏到电视机,轻松享受更大画面

在数字化的今天&#xff0c;我们常常希望在更大的屏幕上分享电脑上的内容&#xff0c;观看视频、展示演示文稿&#xff0c;或者与家人一同欣赏照片。而实现电脑屏幕投射到电视机上&#xff0c;成为了许多人追求的方便而实用的功能。本文将为您详细介绍电脑投屏到电视机的方法&a…

汽车IVI中控开发入门及进阶(二十六):视频解码芯片ADV7180

前言: ADV7180芯片的功能框图如下: ADV7180自动检测并将兼容全球NTSC、PAL和SECAM标准的标准模拟基带电视信号转换为兼容8位ITU-R BT.656接口标准的4:2:2分量视频数据。简单的数字输出接口与各种MPEG编码器、编解码器、移动视频处理器以及Analog Devices数字视频编码器(如A…

跨平台看抖音、哔哩哔哩、虎牙、斗鱼啦,一个app即可完成

一、简介 1、一款免费、开源、无广告、跨平台的,可以观看抖音、哔哩哔哩、虎牙、斗鱼等平台的直播内容的软件。它简单好用,支持 Windows、MacOS、Linux、Android、iOS 等平台。 二、下载 1、文末有下载链接,apk手机可直接安装,不明白可以私聊我哈(麻烦咚咚咚,动动小手给个…

浮动与弹性的区别

弹性与浮动在Web页面布局中有着不同的概念和应用&#xff0c;以下是它们之间的主要区别&#xff1a; 定义与应用领域&#xff1a; 弹性&#xff1a;在物理学和机械学上&#xff0c;弹性描述的是物体在外力作用下发生形变&#xff0c;并在外力撤除后恢复原来大小和形状的性质。…

C++ 字符串处理3-实现starts_with和ends_with的字符串判断功能

1. 关键词2. C20及之后3. C20之前 3.1. strutil.h3.2. strutil.cpp3.3. 测试代码3.4. 运行结果3.5. 源码地址 1. 关键词 C 字符串处理 starts_with ends_with std::string 跨平台 2. C20及之后 C20标准开始&#xff0c;STL已经提供了starts_with和ends_with函数&#xff0…

Matrix->Matrix工具类获取Matrix的平移、缩放、错切数值

// 传入矩阵&#xff0c;获取矩阵数值 class MatrixValues(matrix: Matrix) {val scaleX: Floatval scaleY: Floatval transX: Floatval transY: Floatval skewX : Float val skewY : Floatinit {val fromValues FloatArray(9)matrix.getValues(fromValues)// 缩放数值scaleX …

【PythonGIS】基于Arcpy修改mxd版本

我们在使用ArcGIS时有时候保存或别人发过来的mxd工程文件会打不开&#xff0c;大概率是因为mxd保存的版本不一样&#xff0c;ArcGIS可以使用高版本打开低版本保存的mxd&#xff0c;反之则不行&#xff0c;所以今天给大家分享一下如何修改mxd版本。 原创作者&#xff1a;RS迷途小…

有什么好用的ai智能写作手机版?6个软件帮助你快速进行智能写作

有什么好用的ai智能写作手机版&#xff1f;6个软件帮助你快速进行智能写作 AI智能写作在现代社会中扮演着越来越重要的角色&#xff0c;许多人依赖这些工具来提高写作效率和质量。以下是六款不同类型的AI智能写作手机应用&#xff0c;它们可以帮助你快速进行智能写作&#xff…

十种排序方法

目录 1.冒泡排序&#xff08;Bubble Sort&#xff09;代码实现 2.选择排序&#xff08;Selection Sort&#xff09;代码实现 3.插入排序&#xff08;Insertion Sort&#xff09; 4.希尔排序&#xff08;Shell Sort&#xff09;代码实现 5.快速排序&#xff08;Quick Sort&…

element 表格el-table的 :cell-style用法-表格固定行文字高亮

el-table的 :cell-style用法 实现表格固定行文字高亮效果 <el-tableref"table"borderstripe:data"list":height"height"highlight-current-row:cell-style"cellStyle"><el-table-columnprop"code"label"规则…

扩展学习|高校风险管理研究综述

文献来源&#xff1a;[1]高娟.高校风险管理研究综述[J].财会通讯&#xff1a;上, 2015(6):4.DOI:CNKI: SUN:CKTX.0.2015-16-012. 文章简介&#xff1a;基于对高校风险研究的梳理&#xff0c;纵观现有研究成果&#xff0c;高校风险管理研 究已逐步体现理论基础多学科化、研究流派…

iOS接入Flutter

在现有的iOS项目上接入Flutter&#xff0c;参考链接 第一步&#xff1a;创建flutter项目&#xff0c;即 创建 Flutter module flutter create --template module my_flutter第二步&#xff1a;创建framework&#xff0c;这里选择的是B方式&#xff0c;即 选项 B - 在 Xcode 中…

UnityWebRequest获取本地txt文件,其中中文乱码问题(踩坑记录)

Unity获取本地streamingassert下txt文件&#xff0c;遇到点问题&#xff0c;就是用UnityWebRequest下载一个txt文件的时候&#xff0c;原txt在资源管理器用notepad打开显示正常&#xff0c;但是Unity里调试&#xff0c;打印内容却是乱码&#xff0c; 在notepad 转存为utf-8&…

2024年【陕西省安全员C证】考试资料及陕西省安全员C证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证考试资料根据新陕西省安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将陕西省安全员C证模拟考试试题进行汇编&#xff0c;组成一套陕西省安全员C证全真模拟考试试题&#xff0c;学员可通过…

Frontier疑遭网络风暴:RansomHub组织公开勒索超过200万用户数据

在数字世界的阴影中&#xff0c;一个名为RansomHub的组织悄然崛起&#xff0c;因几起数据泄露事件而备受关注&#xff0c;最近&#xff0c;这个神秘组织宣称他们已经掌握了电信巨头Frontier超过200万的数据信息&#xff0c;这无疑在原本就波谲云诡的网络安全领域投下了一颗重磅…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍓OJ题目截图 📎在线评测链接 团队派遣(100分) 🌍 评测功能需要订阅专栏…

SolarWinds Serv-U 目录遍历漏洞复现(CVE-2024-28995)

0x01 产品简介 SolarWinds 是一家提供广泛的 IT 管理和网络管理软件解决方案的公司。SolarWinds 的产品被设计用于监控和管理网络设备、服务器、应用程序和网络流量等。Serv-U 是 SolarWinds 提供的一款 FTP(文件传输协议)服务器软件,它允许用户在 Windows 、Linux 系统上设…