首頁  >  問答  >  主體

php - 導入10萬條數據,資料庫裡有100萬條數據,如何判斷重複?

具體需求

  1. 資料庫裡存在100萬個資料;

  2. 要導入10萬個資料;

  3. 如果要匯入的資料在資料表裡存在,則終止資料導入;

疑問

如何在每個資料需要對比的情況下快速導入,同時導入失敗進行資料回滾?

PHP中文网PHP中文网2683 天前736

全部回覆(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
  • 取消回覆