我最近使用这个从我的数据库中删除了超过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。
答案 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万条新记录,您会发现光盘使用量没有增加。
如果你真的想要空间。优化表。此操作也需要很长时间。