【发布时间】:2015-09-04 12:57:38
【问题描述】:
我们在 Django 中有一个非常大的应用程序,它使用 Postgres 数据库。我们想构建一个分析模块。
此模块使用基本查询,例如
someFoo = SomeFoo.objects.all() # Around 100000 objects returned.
然后对这些数据进行切片和切块。即
someFoo.objects.filter(Q(creator=owner) | Q(moderated=False))
这些查询将非常密集,因为这将是一个分析和报告仪表板,查询将对数据库造成非常严重的影响。
在这种情况下处理复杂查询的最佳方法是什么?即当您有一个基本查询并且它将在很短的时间内经常被切片和切块并且永远不会再次使用时。
我们有几个可能的解决方案
- 只读数据库和只写数据库。
- 编写原始 sql 查询并使用它们。因为 django ORM 对于某些类型的查询可能效率很低。
- 大量缓存(尚未对此进行任何研究或研究。)
编辑:例如查询
select sport."sportName", sport.id, pop.name, analytics_query.loc_id, "new count"
from "SomeFoo_sportpop" as sportpop join "SomeFoo_pop" as pop on (sportpop.pop_id=pop.id) join "SomeFoo_sport" as sport on (sportpop.sport_id=sport.id) join
(select ref.catcher_pop_id as loc_id,
(select count(*) from "SomeFoo_pref" where catcher_pop_id=ref.catcher_pop_id and status='pending' and exists=True) as "new count"
from "SomeFoo_pref" as ref
where ref.exists=TRUE and ref.catcher_pop_id is not NULL
group by ref.catcher_pop_id) as analytics_query on (sportpop.pop_id=analytics_query.loc_id)
order by sport."sportName", pop.name asc
这是我们计划进行的原始 sql 查询的示例,它将有很多 where 语句和 groupby。基本上,我们将对基本查询进行大量切片和切块。
您是否有其他可能的解决方案或方法可以向我们指出。非常感谢任何帮助。
【问题讨论】:
-
正确索引表。如果没有关于您将要执行的查询的更多详细信息,很难说它们为什么会变慢。给出的示例应该不会对大多数数据库引擎造成任何问题。
-
我建议不要在“我们如何在 Django 中最好地做到这一点”中查看这一点,而是查看“我们如何在 PostgreSQL 中最好地做到这一点”。如果你在那里找到了解决方案,那么下一步可能是“我们如何才能最好地在 Django 中实现这个 PostgreSQL 解决方案”。
标签: django postgresql django-orm