首页  >  问答  >  正文

php - 导入10万条数据,数据库里有100万条数据,如何判断重复?

具体需求

  1. 数据库里存在100万条数据;

  2. 要导入10万条数据;

  3. 如果要导入的数据在数据表里存在,则终止数据导入;

疑问

如何在每条数据需要对比的情况下快速导入,同时导入失败进行数据回滚?

PHP中文网PHP中文网2737 天前768

全部回复(4)我来回复

  • phpcn_u1582

    phpcn_u15822017-05-16 13:11:47

    假定目标表叫做 target(100万数据), 需要导入的表叫做 source(10万数据)。
    本例很大的一部分时间消耗在于判断是否两张表中的记录一样,猜测楼主想要 所有字段都相同(除了id字段)才认定为是同一条记录。

    给每条记录计算一个类Hash值,可以存在target和source新建的字段中(hashValue), 计算量是 110万。
    然后使用以下语句导入数据

    IF EXISTS(
        SELECT TOP 1 1
          FROM source a
          INNER JOIN target b
        ON a.hashValue = b.hashValue
    ) BEGIN
    
      -- 返回重复记录
        SELECT a.*
          FROM source a
          INNER JOIN target b
        ON a.hashValue = b.hashValue
    
    END
    ELSE 
    BEGIN
        INSERT INTO Target(filed1, field2, field3, field4 ... hashValue)
        SELECT
          t.filed1,
          t.field2,
          t.field3,
          t.field4, ..., t.hashValue
        FROM target t
    END

    回复
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-16 13:11:47

    如果考虑事务效率必定不高

    个人思路参考下:

    1、先判断要插入的数据是否存在

    select id from table where id in('k1,k2,k3');

    2、不存在 拼sql 写入数据库

    10w 数据 拼 1条sql,插入速度 2秒 以内解决

    可以看下我之前写的一篇文章,优化一次插入20w数据3秒内完成
    https://my.oschina.net/famous...

    回复
    0
  • 滿天的星座

    滿天的星座2017-05-16 13:11:47

    我个人的思路是:关键点在于判重,建立唯一索引,导入的时候就能保障唯一性了,批量导入可以参照@石头记的方法。

    回复
    0
  • 怪我咯

    怪我咯2017-05-16 13:11:47

    基于这个问题,后续在导入的时候又出现了比较大问题,数据导入缓慢,因此关于这个,我写了一篇文章:

    /a/11...

    希望后续有人看到了之后,能做一定的参考。

    回复
    0
  • 取消回复