首頁  >  問答  >  主體

php - laravel中導入excel 資料量很大的情況下 處理重複資料時如果做最好

用laravel excel導入使用者的excel
能夠預期到的一個excel大概會有幾千到幾萬條不等。
需要判斷不導入重複的用戶,例如導入10000人 資料庫裡面已經有100人了 那麼這100人需要被判斷出來 做另外的邏輯處理。另外9900人導入。並且記錄9900的插入狀態 例如成功8000筆 失敗1900條。想在想到幾個方案 不知道哪個比較合理
1、傳統的批量的插入方法,無法精確到每條數據是否重複或記錄返回狀態。但是效率應該是比較高的。
2、用for循環 插入前 先查詢然後是否存在 然後插入完再記錄狀態 從業務邏輯上是最能符合需求的 但是效率很低,估計很容易就要500錯誤或者timeout。
3、在2的基礎上改進 把整個過程寫入隊列 chunk分組後 進隊列 然後後台處理。缺點就是使用者相對來說體驗比較差,不能立等可取 還需要配合通知系統來做這個。
4、查了下 還有種是用事務 分塊提交,不知道這種如何 還沒有測試。也請各位大大指教。

不知道各位大大還有什麼更好的辦法。能夠在效率和邏輯中都比較平衡的。感謝了

世界只因有你世界只因有你2737 天前1127

全部回覆(2)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 13:00:18

    看題目的意思,我理解是
    1、excel 上傳
    2、excel 分析,入庫
    3、回傳資料給使用者

    整個過程,應該是比較耗時的,可以給使用者【處理中】的狀態,後台處理,等完全處理好之後,輸出結果。

    至於判斷是否重複用戶,記錄成功失敗的狀態,可以考慮先存入 redis 會比較快,最後所有結果 入庫 處理

    回覆
    0
  • 大家讲道理

    大家讲道理2017-05-16 13:00:18

    說下我的思路,不喜勿噴.

    假設資料庫和excel中唯一的識別為使用者身分證號碼:

    • 將資料庫中現有的身分證號查出來,

    • Excel上傳之後,遍歷每一行,並判斷當前這一資料中的身分證號是否在資料庫中查出來的是數組中

    • 如果不在,寫入資料庫,並在查出來的陣列中追加這個身分證號,

    • 如果在,跳過

    我這邊線上環境,一次上傳一個5w+行的Excel文件,等待時間也就6秒左右.
    當然,每個線上環境和Excel文件的單行列數是不一樣的,
    僅供樓主參考.

    回覆
    0
  • 取消回覆