首页 > 其他分享 >大数据量导入去重的优化方法探讨

大数据量导入去重的优化方法探讨

时间:2024-11-12 10:17:26浏览次数:3  
标签:JOIN 探讨 columnA columnB 导入 数据量 t1 LEFT

文章目录


大数据量导入去重的优化方法探讨

在处理大规模数据导入(如十万级别)时,难免会遇到数据重复的问题。特别是当导入的数据中某些字段在目标数据库中(如千万级别的记录)已有重复时,我们需要将重复数据排除掉,以保持数据的一致性。然而,若简单地将数据库中的数据查询出来,再使用程序去重会大幅降低效率。为此,我们可以引入临时表,并使用 SQL 的方式高效去重。

以下是具体的操作步骤和性能分析:

使用临时表缓存导入数据

在导入新数据之前,先将其插入到一个临时表中,临时表的结构与原始表保持一致。这样可以避免直接操作原始表,提升操作的灵活性和安全性。

使用 SQL 查询不重复数据

接下来,通过 SQL 语句查询出与原始表不重复的数据集合(即 DataA)。此时我们有两种主要的方法来过滤重复数据:

  • 方法一:使用 NOT EXISTS

    SELECT * 
    FROM tableTemp t1 
    WHERE NOT EXISTS (
        SELECT 1 
        FROM tableName 
        WHERE columnA = t1.columnA 
          AND columnB = t1.columnB
    )
    

    NOT EXISTS 语句会在临时表 tableTemp 中逐条查询数据,并通过子查询来检查在 tableName 表中是否存在相同的 columnAcolumnB 值。如果不存在,则认为这条记录不重复。

  • 方法二:使用 LEFT JOIN

    SELECT * 
    FROM tableTemp t1
    LEFT JOIN tableName t2 
        ON t2.columnA = t1.columnA 
        AND t2.columnB = t1.columnB 
    WHERE t2.columnA IS NULL
    

    在此方法中,LEFT JOIN 会从临时表 tableTemp 中查询所有记录,并将其与 tableName 中匹配的记录进行连接。如果 tableName 中不存在匹配记录,则结果中的 t2.columnA 会为 NULL,此时说明该记录在原表中不重复。

将不重复数据插入原始表

查询出不重复的数据 DataA 后,可以将其插入到原始表 tableName 中。如果不需要进一步处理,可以直接使用 INSERT INTO SELECT 的语句来批量插入。插入完成后,清空临时表,便于下次导入。

INSERT INTO tableName (columnA, columnB, ...)
SELECT columnA, columnB, ...
FROM DataA;

性能对比分析

在实际测试中,不同方法在不同数据量下的性能差异显著(注:以下为参考测试数据,不同数据结构和索引情况可能会有不同结果)。

单表去重

  1. NOT EXISTS 的性能特点

    • 当导入数据量较小时(如10万以下),NOT EXISTS 表现较优。
    • 然而,随着数据量增加,查询耗时显著增加。例如,当数据达到10万条时,耗时约为25秒。
  2. LEFT JOIN 的性能特点

    • LEFT JOIN 在小数据量时性能略慢,但较为稳定。即便数据量达到10万时,耗时约为40秒,并未随数据量大幅增长。

结论:在单表去重场景中,导入数据量不是特别大时,优先使用 NOT EXISTS。数据量较大时,LEFT JOIN 更适合。

双表去重

若需对临时表数据与原表 tableNameAtableNameB 两张表的数据同时去重,有以下两种查询方式:

  • 方法一:NOT EXISTS 配合 UNION ALL

    SELECT * 
    FROM tableTemp t1 
    WHERE NOT EXISTS ( 
        SELECT 1 FROM tableNameA WHERE columnA = t1.columnA AND columnB = t1.columnB 
        UNION ALL
        SELECT 1 FROM tableNameB WHERE columnA = t1.columnA AND columnB = t1.columnB 
    )
    
  • 方法二:使用 LEFT JOIN

    SELECT * 
    FROM tableTemp t1
    LEFT JOIN tableNameA t2 ON t2.columnA = t1.columnA AND t2.columnB = t1.columnB 
    LEFT JOIN tableNameB t3 ON t3.columnA = t1.columnA AND t3.columnB = t1.columnB 
    WHERE t2.columnA IS NULL AND t3.columnA IS NULL
    

测试结果

  • 对于较小的数据量(如3万以下),NOT EXISTS 效率更高。
  • 随着数据量的增加,LEFT JOIN 性能更为稳定。例如,在导入数据达到10万时,NOT EXISTS 用时可能增至150秒,而 LEFT JOIN 约为40秒。

结论:双表去重时,当导入数据量较少时(如3万以下)优先使用 NOT EXISTS。当数据量较大时,LEFT JOIN 更具优势。

总结

根据实际情况合理选择去重方法:

  • 单表去重时,数据量较小时使用 NOT EXISTS,数据量较大时使用 LEFT JOIN
  • 双表去重时,数据量小于3万时使用 NOT EXISTS,超过3万时使用 LEFT JOIN

标签:JOIN,探讨,columnA,columnB,导入,数据量,t1,LEFT
From: https://blog.csdn.net/weixin_42434700/article/details/143703678

相关文章

  • 贪心专题探讨
    导言有人说,在古代以及近代,维护信任的纽带大多是道德与名誉。而到了现代,只有利益才能够稳定地维护信任。但其实,道德与名誉在古时显然也是一种利益。道德带来信誉,良好的信誉是邻里关系的基础,这是社交环境中最大的利益。人们拥有不同理智程度的价值观,以自己的价值观为准绳,去进行......
  • 蓝牙电话-如何做到无人值守(方案探讨)
    蓝牙电话-如何做到无人值守(方案探讨)一、前言在蓝牙电话出现和在市场上使用的过程中,有好多的客户和友商隐晦或含蓄的咨询,问说蓝牙方案及其构建的体系,能不能做到无人值守?就是那种因业务原因需要把设备部署到全国各地,然后使用的人在某个地点统一集中拨打,然后运维人员每个月巡视......
  • Chrome浏览器如何导出所有书签并导入书签
    前言我平常在开发中,基本是用的谷歌的浏览器,也就是Chrome,因为这个对于开发来说,比较友好。在开发中,包括调试接口,打断点,查看打印日志等,都是非常不错的。另一方面,谷歌浏览器的书签管理功能,可以让我将我发现的好的网站或者博客等,变成我的书签,到时候我可以迅速的打开这些网页。不过,由......
  • 失物招领信息管理系统(含源码+sql+视频导入教程+文档+PPT)
    失物招领信息管理系统1、项目介绍失物招领信息管理系统1拥有两种角色,分别为管理员和用户,具体功能如下:管理员:招领信息管理、寻物信息管理、留言信息管理、申请信息管理、物品类型管理、学生管理、管理员管理、公告管理用户:招领信息查看与发布、寻物信息查看与发布、留言......
  • 基于SSM的书店图书销售管理系统(含源码+sql+视频导入教程+文档+PPT)
    1、项目介绍书店图书销售管理系统3具有两种个角色,分别为管理员和用户,具体功能如下:管理员:书籍的增删改查、书籍类型的增删改查、用户的增删改查、订单审核、订单详情查看等功能用户:书籍的模糊查询、购买数据、购物车、结算、注册登录等功能2·、项目技术后端框架:SSM(Spr......
  • 将URDF模型文件导入Issac_Gym系列【1】
    1在solidworks中导出URDF文件1这里按照古月居老师的要求进行基本的配置https://www.bilibili.com/video/BV1Tx411o7rH/?vd_source=fcddcf87e97b17fd530dc88db643aab3关于catkin_ws这种ROS的工作环境的配置,具体可以参考我的这篇博客https://www.cnblogs.com/myleaf/p/1846629......
  • 从消息中间件架构发展趋势,探讨物联网平台如何支持亿级设备推送?
    本文分享自《华为云DTSE》第五期开源专刊,作者:贺张俭华为云IoT技术专家随着物联网平台业务的快速增长,基于传统消息中间件构筑面临着处理亿级设备连接和海量数据的挑战。本文分析了消息中间件的架构发展趋势以及核心优势,还探讨了ApachePulsar在华为云IoT平台上的实践应用,展示了华......
  • import导入文件路径注意点
    目录结构-lib-main.py-package1-subA.py-subB.py-package2-subC.py-subD.py要在main文件中导入subA#方案1-main.pyfrompackage1importsubA#方案2-main.pyfromlib.package1importsubA要在main文件中,通过subA导......
  • 道品科技水肥一体化在农业生产中的必要性与应用领域探讨
    ####引言在全球气候变化和资源日益紧张的背景下,农业生产面临着前所未有的挑战。水资源短缺、土壤退化、肥料过量使用导致的环境污染等问题日益突出。而水肥一体化作为一种新兴的农业生产管理模式,逐渐成为解决这些问题的重要手段。水肥一体化不仅能够有效提高资源利用效率,还能......
  • Vue 3 项目中导入外部的 <link> 和 <script> 资源
    在Vue3项目中,可以通过以下几种方式来导入外部的<link>和<script>资源:导入外部CSS文件方法1:在单个组件中使用 <style> 标签可以在单个Vue组件的<style>部分使用@import语句来导入外部CSS文件:<template><!--组件模板--></template><scriptsetup......