php - 導入10萬條數據,資料庫裡有100萬條數據,如何判斷重複?
PHP中文网
PHP中文网 2017-05-16 13:09:47
0
4
776

具體需求

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

  2. 要導入10萬個資料;

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

疑問

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

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(4)
phpcn_u1582

假定目標表叫做 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
我想大声告诉你

如果考慮事務效率必定不高

個人思路參考下:

1、先判斷要插入的資料是否存在

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

2、不存在 拼sql 寫入資料庫

10w 資料 拼 1條sql,插入速度 2秒 以內解決

可以看下我之前寫的一篇文章,優化一次插入20w數據3秒內完成
https://my.oschina.net/famous...

滿天的星座

我個人的思路是:關鍵點在於判重,建立唯一索引,導入的時候就能保障唯一性了,批量導入可以參照@石頭記的方法。

刘奇

基於這個問題,後續在導入的時候又出現了比較大問題,數據導入緩慢,因此關於這個,我寫了一篇文章:

/a/11...

希望後續有人看到了之後,能做一定的參考。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板