有大批量的数据导入到数据库,规则是数据库有相应主键的就update没有就insert怎么做效率快

理此类具有条件的 “upsert”(更新或插入)操作时,您想要最小化对数据库的访问次数并使用高效的SQL逻辑。以下是几个数据库平台通常使用的方法:

MySQL:

在 MySQL 中,可以使用 INSERT ... ON DUPLICATE KEY UPDATE 语句。

INSERT INTO table_name (a, b, c) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c); 

如果主键或唯一索引触发了重复冲突,则执行 UPDATE

PostgreSQL:

PostgreSQL 可以使用 ON CONFLICT 子句进行类似操作。

sql INSERT INTO table_name (a, b, c) VALUES (1, 2, 3) ON CONFLICT (a) DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c; 

如果字段 a 出现冲突,则会进行更新。 ### SQL Server: SQL Server 使用 MERGE 语句来整合逻辑。

MERGE INTO table_name USING ( VALUES (1, 2, 3) ) AS incoming (a, b, c) ON table_name.a = incoming.a WHEN MATCHED THEN UPDATE SET b = incoming.b, c = incoming.c WHEN NOT MATCHED THEN INSERT (a, b, c) VALUES (incoming.a, incoming.b, incoming.c); 

这将根据是否存在匹配的 a 值来选择更新现有行或插入新行。

Oracle:

Oracle 使用 MERGE 类似 SQL Server。

MERGE INTO table_name USING dual ON (table_name.a = 1) WHEN MATCHED THEN UPDATE SET b = 2, c = 3 WHEN NOT MATCHED THEN INSERT (a, b, c) VALUES (1, 2, 3); 

针对大批量数据,您可以使用上面的语句模式结合批量操作技术,例如先前讨论的 MyBatis 配置批量操作或将数据分割为批次进行处理。在 MyBatis 中使用 foreach 批量操作时,可以在单个 insert 语句内嵌入相应的“upsert”逻辑。

性能优化:

  • 先批量查询:首先对所有导入数据执行一次查询匹配主键,将匹配的数据和未匹配的数据分开,分别进行批量的update和insert。
  • 使用缓存或临时表:根据数据量大小,考虑使用缓存技术(如 Redis)或临时表来批量处理数据,减少对主表的操作负担。
  • 索引优化:确保数据库表上的主键或唯一索引是针对此类 “upsert” 操作优化的,以缩短搜索时间。
  • 减少事务提交的频率:在上文所提的 MyBatis 执行器类型设置为 BATCH 的情况下,尽量在合适的量级后提交事务。 每次操作都应根据数据库服务器的实际情况和硬件能力来调整,实现最佳性能。同时也要注意适当的错误处理机制,确保数据的一致性和完整性。

使用临时表怎么实现

使用临时表来进行大批量的 “upsert” 操作(更新已存在的记录或插入新记录)可以分解成以下步骤:

  1. 创建临时表: 创建一个临时表,其结构与目标表相同或包含你想要插入/更新的字段。
CREATE TEMPORARY TABLE temp_table_name LIKE target_table_name; 
  1. 批量插入数据到临时表: 将所有要导入的数据批量插入到创建的临时表中。
INSERT INTO temp_table_name (col1, col2, ...) VALUES (val1a, val2a, ...), (val1b, val2b, ...), ...; 
  1. 锁定目标表(可选): 如果数据的一致性非常关键,并且可以承受锁定表的短暂时期,考虑在进行操作前锁定目标表。
LOCK TABLES target_table_name WRITE;
  1. 更新目标表中匹配临时表的行: 将目标表中那些在临时表中有匹配的记录进行更新。
UPDATE target_table_name INNER JOIN temp_table_name ON target_table_name.primary_key = temp_table_name.primary_key SET target_table_name.col1 = temp_table_name.col1, target_table_name.col2 = temp_table_name.col2, ...; 
  1. 将不存在于目标表中的记录插入到目标表: 将临时表中的新记录插入到目标表中。
INSERT INTO target_table_name (primary_key, col1, col2, ...) SELECT primary_key, col1, col2, ... FROM temp_table_name WHERE NOT EXISTS (SELECT 1 FROM target_table_name WHERE target_table_name.primary_key = temp_table_name.primary_key); 
  1. 释放表锁(如果前面对表进行了锁定):
UNLOCK TABLES; 
  1. 删除或清空临时表(如果是持久的临时表):
DROP TEMPORARY TABLE IF EXISTS temp_table_name; -- 或者 TRUNCATE TABLE temp_table_name; 

这种方法首先同步已存在的记录,然后添加新记录,这样可以避免主键或唯一约束冲突。但是,这个过程可能会根据数据库的负载和表的大小而导致性能下降,特别是如果涉及到大量数据时。因此,该操作应在系统负载较低的时候执行,并且需要适当的错误处理和事务管理以确保数据一致性。 使用临时表策略可以有效地将 “upsert” 操作的资源消耗分散开来,并且通过先处理数据然后一次性操作,减少了数据库的I/O开销。它还节省了在每条记录检查时索引查找的成本,因为它将这些操作汇总到大批处理中。不过,请根据实际情况及数据库特性来处理,可能需要调整语句以适应不同的数据库系统。

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

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

相关文章

代码随想录算法训练营第二十二天| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

系列文章目录 目录 系列文章目录235. 二叉搜索树的最近公共祖先①递归法自己写的简洁版 ②迭代法不能这样写!正确写法 701.二叉搜索树中的插入操作①递归法②迭代法 450.删除二叉搜索树中的节点递归法 235. 二叉搜索树的最近公共祖先 ①递归法 自己写的 class So…

书生·浦语大模型InternLM-Chat-1.8B 智能对话 Demo 第二期

文章目录 InternLM-Chat-1.8B 智能对话 Demo环境准备下载模型运行 InternLM-Chat-1.8B web 运行八戒 demo下载模型执行Demo InternLM-Chat-1.8B 智能对话 Demo 环境准备 在InternStudio平台中选择 10% A100(1/4) 的配置(平台资源有限),如下图…

【c语言】自定义类型:联合体(公用体)【详解】

联合体 联合体类型的声明 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共用体。 给联合体其中⼀个成…

Lua 通过元方法简单实现属性Get/Set访问

通过元方法__index、__newindex、rawset,我们可以实现属性的Get/Set访问,类似于C#: public string name; public string Name {get > name;set > name value; }方法一:将属性数据存在元表中 local meta { name "m…

一点点金融 3

一点点金融 3 经验总结如何调整心态 长期交易系统设计逻辑:解决万倍股拿不住,归零股死扛的问题止损点设计:避免爆仓的三部曲(重仓、逆势、死扛)择时点设计:你要赚的不是蝇头小利,而是一整个大波…

2024阿里云域名优惠口令免费领取,COM、CN和xin域名口令

2024年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续…

【QT入门】 自定义标题栏界面qss美化+按钮功能实现

往期回顾: 【QT入门】 鼠标按下和移动事件实现无边框窗口拖动-CSDN博客【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客 【QT入门】 自定义标题栏界面qss美化按钮功能实现 一、最终效果 二、…

初识人工智能---------自然语言处理词袋模型

1.自然语言处理(NLP) 自然语言处理(Natural Language Processing,简称NLP)研究的是如何通过机器学习等技术,让计算机学会处理自然(人类)语言,以完成有意义的任务。 下面…

数据库调优----分库分表

目录 分库分表 分表 分库 分库分表缺点 分库分表 先考虑读写分离,读写分离不行的话再分库分表 读写分离:将数据库的写操作和读操作进行分离, 使用多个从库副本(Slaver)负责读,使用主库(Maste…

【JAVASE】学习类与对象的创建和实例化

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 目标: 1. 掌握类的定义方式以及对象的实例化 2. …

MVCC的实现原理

简介 MVCC(Multi-Version Concurrency Control)即多版本并发控制。 MVCC的实现原理 我们在了解MVCC之前,首先先了解一下几个比较常见的锁。 **读锁:**也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务…

一维卷积神经网络的特征可视化

随着以深度学习为代表的人工智能技术的不断发展,许多具有重要意义的深度学习模型和算法被开发出来,应用于计算机视觉、自然语言处理、语音处理、生物医疗、金融应用等众多行业领域。深度学习先进的数据挖掘、训练和分析能力来源于深度神经网络的海量模型…

使用OpenCV4.9的随机生成器和文本

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 4.9基本绘图 下一篇:OpenCV系列文章目录(持续更新中......) 目标 在本教程中,您将学习如何: 使用随机数生…

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略,其主要思想是将一个复杂的大系统分解为若干子系统,以便降低复杂度,并且增加可修改性。程序从其执行起点开始执行该构件的代码,程序执行…

分发饼干(力扣455)

文章目录 题目贪心算法思想概述关键要素解题步骤优缺点优点缺点 应用领域 题解一、思路二、解题方法三、Code 总结 题目 Problem: 455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i&am…

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别:数据存储方式:时间复杂度:空间复杂度: 总结: 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

Stream 流和 Lambda 组装复杂父子树形结构

在最近的开发中,遇到了两个类似的需求:都是基于 Stream 的父子树形结构操作,返回 List 集合对象给前端。于是在经过需求分析和探索实践后有了新的认识,现在拿出来和大家作分享交流。 一般来说完成这样的需求大多数人会想到递归&a…

面试题 之 vue

1.vue里怎样实现双向数据绑定? Viewmodel 中的Domlisteners 工具会帮我们检测页面上Dom元素的变化,如果有变化,则更改Model中的数据,更新model中的数据时,数据事件绑定工具会帮我们更新页面中的Dom元素 2.Vue的响应式原…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中,3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中,有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面,介绍如何将3D代理模型转换成标准模型,以帮助读者更…

【MySQL】事务是什么?事务的特性又是什么?

文章目录 ✍事务是什么?✍事务的特性(四个)✍事务并发时出现的问题✍事务的隔离性 ✍事务是什么? 事务是由一个或多个SQL语句构成的,在事务中,这些的SQL不可分割,是一个整体,整个事…