繁体   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