问答

mysql如何高效快速整合两个表的内容?

作者:admin 2021-05-11 我要评论

需求 A表中有70万数据,B表中有50万数据。 现在要实现: 将B表导入A表。 A、B两个表中有一些重复数据,比如A表中有name='张三'这个字段,B表中也有name='张三'这...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

需求

A表中有70万数据,B表中有50万数据。
现在要实现:
将B表导入A表。
A、B两个表中有一些重复数据,比如A表中有name='张三'这个字段,B表中也有name='张三'这个字段,则两个保留一个。若B表中有,A表中没有,则往A表中添加。

我的实现

while(B表中查出的数据不为空){
    //查询出B表中的数据
    //每次查询1000条B表中的数据,循环查询直到查询为空
    $data = selectFromB(1000);
    $needInsert = [];  //需要添加的数组
    for($data as $key=>$value){
        //判断该数据在A表中是否存在
        $existInA = isExistInA($value['name']);
        if($existInA == 0){  //在A表中不存在,则添加
            array_push($needInsert,$value);
        }
    }
    //将本次处理得到的需要添加的数据批量添加到A表
    batInsertToA($needInsert);
}

遇到的问题

中间那一步isExistInA(判断该数据在A表中是否存在)太耗时,每循环一遍都要去查一次库,导致将A、B整合完成都需要半个小时的时间。
请问这种问题如何优化?

###

1、70W数据不多,一次性将A表的ID、NAME保存在内存里,然后批量读B表,判断重复数据。
2、写入数据的时候,批量写,例如一次写200条数据,性能会大大提高。
3、可以一边处理数据,一边写数据,即处理好了200条,就直接写入,不必等所有数据都处理好了,再写。
4、70W数据按ID排序,记住最后一次处理的ID,这样任务即使中途结束,不用重新开始。
5、别开事务。
6、找个凌晨3点执行任务。
7、B表的数据一次读1000条,太少了,可以读1W条,而且只读ID和NAME,这样筛选了符合条件的记录之后,可以:
insert into A select * from B where ID in (12,13,14)
如果B表的列很多,可以节省很多网络开销。

关注我的博客: https://www.epoooll.com/

###

读取全部数据的name保存在内存中,在内存中判断

###

INSERT INTO demo1 (name) (select name from demo2 where name not in (select name from demo1));

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • mysql如何高效快速整合两个表的内容?

    mysql如何高效快速整合两个表的内容?

  • java 爬虫正则的问题

    java 爬虫正则的问题

  • vue-cli3 把路由解析成了ajax请求

    vue-cli3 把路由解析成了ajax请求

  • push添加回调变量值没有调用函数

    push添加回调变量值没有调用函数

腾讯云代理商
海外云服务器