我有一套中等大小的模型(约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倍慢?
您确定最终查询使用您的新索引吗?如果您运行EXPLAIN,会发生什么情况(您可以通过调试工具栏执行此操作)? – 2013-03-19 15:29:06
向只有两个值的列添加索引从来没有多大帮助。这只会增加开销。另一方面,当没有给出任何标准时,几乎所有的数据库都会优化“COUNT”。 - 你是否分析过SQL查询使用Djange调试工具栏? Django可以用'count()'做一些奇特的事情。如果它没有优化你的查询,那么Django会将这些对象加载到内存中,从而产生一些开销。 'values()'可以防止大部分这种开销。 – 2013-03-19 15:29:42
lukeplant.me.uk/blog/posts/some-quick-django-optimisation-lessons/ – catherine 2013-03-19 17:10:22