[英]How can I improve django mysql copy performance?
我有一个django应用程序,它定义了一个模型( Person
),我也有一些DB(有一个表Appointment
),没有定义任何模型(并不意味着连接到django应用程序)。
我需要将一些数据从Appointment
表移到Person
,以便People表需要镜像Appointment表的所有信息。 这是因为有多个独立的数据库,比如Appointment需要复制到Person表(所以我不想对它的设置方式进行任何架构更改)。
这是我现在所做的:
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表中。 如果有办法检查两个重复的密钥,我认为这种方法是有效的。
一些想法:
with transaction.atomic():
将事务全部包含在事务中,因为默认情况下Django将为每次save()
调用创建一个新事务,这可能会变得非常昂贵。 使用20K记录,一个巨大的事务也可能是一个问题,因此您可能必须编写一些代码将事务分成多个批次。 试一试并测量! SELECT
查询而不是每个记录获取一个所有现有Person对象 bulk_create
。 这仍然会为您的更新发出UPDATE
查询,但会将所有INSERT
查询减少到只有一个/几个,这仍然是一个改进。 您可以通过在调用save()
之前插入不具有主键的事实来区分插入和更新,并将插入保存到Python列表中以用于以后的bulk_create
而不是直接保存它们 INSERT … ON DUPLICATE KEY UPDATE
语法。 您不需要相同的主键, UNIQUE
键就足够了。 键可以跨多个列,请参阅Django的Meta.unique_together
模型选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.