我最近使用它从我的数据库中删除了超过 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。
最佳答案
这些是 mysql 问题而不是 django 问题。
慢速删除。
在任何 RDBMS 中,无论是 mysql 还是 postgresql 或其他任何东西,如果有索引,批量插入、删除和更新总是很慢。这就是野兽的本性。
加快速度的最佳方法是检查您的索引并删除所有未在查询中使用的索引。如果要保留所有索引,请优化 key buffer size .
作为 postgresql 的普通用户,我向您保证,这还不足以成为从 mysql 切换到 postgreql 的理由。如果从大局和所有其他因素来看,postgresql 肯定更好,但不要让这个问题成为决定因素。
回收删除的空间
除非你真的非常需要硬盘空间,否则就放手吧。随着表再次增长,该空间将被数据库重用。如果您添加 200 万条新记录,您会发现磁盘使用量根本没有增加。
如果您真的空间不足。优化表。这个操作也需要很长时间。
关于python - 带索引的 Django 批量模型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37649095/