簡體   English   中英

我怎樣才能提高django mysql的復制性能?

[英]How can I improve django mysql copy performance?

我有一個django應用程序,它定義了一個模型( Person ),我也有一些DB(有一個表Appointment ),沒有定義任何模型(並不意味着連接到django應用程序)。

我需要將一些數據從Appointment表移到Person ,以便People表需要鏡像Appointment表的所有信息。 這是因為有多個獨立的數據庫,比如Appointment需要復制到Person表(所以我不想對它的設置方式進行任何架構更改)。

IMG

這是我現在所做的:

res = sourcedb.fetchall() # from Appointment Table
for myrecord in res:
    try:
        existingrecord = Person.objects.filter(vendorid = myrecord[12], office = myoffice)[0]
    except:
        existingrecord = Person(vendorid = myrecord[12], office = myoffice)

    existingrecord.firstname    = myrecord[0]
    existingrecord.midname      = myrecord[1]
    existingrecord.lastname     = myrecord[2]
    existingrecord.address1     = myrecord[3]
    existingrecord.address2     = myrecord[4]
    existingrecord.save()

問題是這太慢了(20K記錄大約需要8分鍾)。 我該怎么做才能加快速度呢?

我考慮過以下方法:

1. bulk_create不能使用它,因為我有時需要更新。

2.刪除all然后bulk_create Person模型對其他東西有依賴性,所以我無法刪除Person模型中的記錄。

3. INSERT ... ON DUPLICATE KEY UPDATE:無法執行此操作,因為Person表的PK與Appointment表PK(主鍵)不同。 約會PK被復制到Person表中。 如果有辦法檢查兩個重復的密鑰,我認為這種方法是有效的。

一些想法:

  • 編輯 :請參閱Trewq對此的評論並首先在您的表格上創建索引...
  • 使用with transaction.atomic():將事務全部包含在事務中,因為默認情況下Django將為每次save()調用創建一個新事務,這可能會變得非常昂貴。 使用20K記錄,一個巨大的事務也可能是一個問題,因此您可能必須編寫一些代碼將事務分成多個批次。 試一試並測量!
  • 如果RAM不是問題(不應該是具有20k記錄的問題),則首先從約會表中獲取所有數據,然后使用單個SELECT查詢而不是每個記錄獲取一個所有現有Person對象
  • 即使其中一些是更新,也請使用bulk_create 這仍然會為您的更新發出UPDATE查詢,但會將所有INSERT查詢減少到只有一個/幾個,這仍然是一個改進。 您可以通過在調用save()之前插入不具有主鍵的事實來區分插入和更新,並將插入保存到Python列表中以用於以后的bulk_create而不是直接保存它們
  • 作為最后的手段:編寫原始SQL以利用MySQL INSERT … ON DUPLICATE KEY UPDATE語法。 您不需要相同的主鍵, UNIQUE鍵就足夠了。 鍵可以跨多個列,請參閱Django的Meta.unique_together模型選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM