我正在尝试使用以下方法删除大约 200,000 个对象(它们都有多个相关对象,总共大约 2,000,000 个对象):
DataRecord.objects.filter(order=self.order).delete()
但是我收到了内部服务器错误(大约 20 分钟后),并且没有删除任何对象。我将 Apache 超时设置为 3600(1 小时),以便为该操作提供足够的时间。
有没有更有效的方法来批量删除大量对象?
我正在尝试使用以下方法删除大约 200,000 个对象(它们都有多个相关对象,总共大约 2,000,000 个对象):
DataRecord.objects.filter(order=self.order).delete()
但是我收到了内部服务器错误(大约 20 分钟后),并且没有删除任何对象。我将 Apache 超时设置为 3600(1 小时),以便为该操作提供足够的时间。
有没有更有效的方法来批量删除大量对象?
似乎最好的解决方案是使用原始查询(请参阅https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly),但是pre_delete
,post_delete
不会触发信号.
随机 ORM 思想:DataRecord.order
列是否被索引?
编辑:识别列是否容易:查看列是否具有设置db_index
属性,即:
class DataRecord(models.Model):
order = models.IntegerField(_("order"), **db_index=True**)
索引允许快速查找数据,而无需读取整个表。这就像一本书中的索引——当你想在其中找到某个单词时,索引会帮助你在不阅读整本书的情况下找到它。
查找将要删除的对象的数量,并在 for 循环中将删除分解为一千左右的倍数。一个简单的例子:
q = DataRecord.objects.filter(order=self.order)
cnt = q.count()
bucket = 1000
a, rem = divmod(cnt, bucket)
i, j, k = 0, bucket, 0
while k<a:
for obj in q[k*bucket: (k+1)*bucket + (k+1==a and rem)]:
obj.delete()
k+=1