2013-03-19 15 views
0

我有一套中等大小的模型(约350,000),由MySQL InnoDB表支持。我目前使用类似于this one的软删除方法,它在数据库中存储deleted属性。如何提高django软删除的性能?

我有一个视图,显示这些项目的计数,我发现过滤软删除的项目是非常缓慢的。

Item.objects.filter(deleted=False).count() -> ~400ms

如果我不排除删除的对象,计数是比较快的。

Item.objects.all().count() -> ~140ms

奇怪的是,如果我的分贝,时间增加的deleted列中添加索引。

Item.objects.filter(deleted=False).count() -> ~450ms # indexed on 'deleted'

我可能会考虑什么替代软删除此方法不会使我的应用程序3倍慢?

+0

您确定最终查询使用您的新索引吗?如果您运行EXPLAIN,会发生什么情况(您可以通过调试工具栏执行此操作)? – 2013-03-19 15:29:06

+0

向只有两个值的列添加索引从来没有多大帮助。这只会增加开销。另一方面,当没有给出任何标准时,几乎所有的数据库都会优化“COUNT”。 - 你是否分析过SQL查询使用Djange调试工具栏? Django可以用'count()'做一些奇特的事情。如果它没有优化你的查询,那么Django会将这些对象加载到内存中,从而产生一些开销。 'values()'可以防止大部分这种开销。 – 2013-03-19 15:29:42

+0

lukeplant.me.uk/blog/posts/some-quick-django-optimisation-lessons/ – catherine 2013-03-19 17:10:22

回答

1

将删除的项目存储在单独的表格中?

+0

这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – Maks3w 2013-03-19 15:44:56

+0

这篇文章最后的问题是“我可以考虑采用这种软删除方法的替代方案吗?”。我的回答肯定看起来很像这个问题的实际答案! – djc 2013-03-19 15:47:22