带指数的Django批量模型删除

时间:2016-06-06 03:21:31

标签: python mysql django django-simple-history

我最近使用这个从我的数据库中删除了超过200万行(我想清除用户不再存在的任何用户历史记录)。我正在使用Django简单的历史。

active_ids = User.objects.values_list("id", flat=True)
User.history.filter(~Q(id__in=active_ids)).delete()

这花了大约5分钟,并删除了我想要的所有行。但是,在我运行操作之前,我的表大小约为900 MB。删除行后,它仍然是700 MB - 超出我的预期。经过进一步检查,看起来这个表的index_length大小仍然很大,为424 MB。我认为它实际上根本没有下降。

此索引大小是否会下降? User模型有一些db_indices,如id,username和email。

2 个答案:

答案 0 :(得分:1)

我建议您更改数据库管理。您可以更改为PostgreSQL,因为它是为更大的数据存储而构建的。或者你可以尝试大数据。以防你的数据真的非常大。不建议删除数据,因为您可以稍后将其用于分析。

您可以尝试使用django和cassandraDB。 https://github.com/r4fek/django-cassandra-engine

答案 1 :(得分:1)

这些是mysql问题,而不是django问题。

慢速删除。

在任何RDBMS中,无论是mysql还是postgresql或其他任何东西,如果你有索引,批量插入,删除和更新将总是很慢。这就是野兽的本性。

加快速度的最佳方法是检查索引并删除任何未在查询中使用的索引。如果要保留所有索引,请优化key buffer size

作为postgresql的常规用户,我向你保证,这不足以从mysql切换到postgreql。如果你看一下大局和所有其他因素,肯定postgresql更好,但不要让这个问题成为决定因素。

回收已删除的空间

除非你真的真的要求硬盘空间,否则就放手吧。当表再次增长时,数据库将重用该空间。如果您添加了200万条新记录,您会发现光盘使用量没有增加。

如果你真的想要空间。优化表。此操作也需要很长时间。