1

我最近使用它从我的数据库中删除了超过 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。

4

2 回答 2

1

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

缓慢删除。

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

加速它的最佳方法是检查您的索引并删除任何未在查询中使用的索引。如果要保留所有索引,请优化键缓冲区大小

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

回收已删除的空间

除非你真的非常需要硬盘空间,否则就放手吧。随着表的再次增长,该空间将被数据库重用。如果添加 200 万条新记录,您会发现磁盘使用量根本没有增加。

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

于 2016-06-06T05:28:28.350 回答
1

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

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

于 2016-06-06T03:45:10.623 回答