带索引的 Django 批量模型删除

Django Bulk Model Deletion with Indices

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

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

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

这个索引大小会下降吗? User 模型有一些 db_indices,比如 id、username 和 email。

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

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

这些是 mysql 问题而不是 Django 问题。

缓慢删除。

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

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

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

回收已删除的内容Space

除非你真的很急用硬盘space,否则就放手吧。当 table 再次增长时,space 将被数据库重用。如果你添加两百万条新记录,你会发现磁盘使用量根本没有增加。

如果你真的迫不及待 space。优化 TABLE。这个操作也需要很长时间。