在Django中进行强烈只读查询的最佳方法是什么

时间:2015-06-18 18:24:35

标签: django postgresql django-orm

我们在Django中有一个非常大的应用程序,它使用Postgres数据库。我们想要构建一个分析模块。

此模块使用基本查询,例如

someFoo = SomeFoo.objects.all() # Around 100000 objects returned. 

然后切片并切块此数据。即

someFoo.objects.filter(Q(creator=owner) | Q(moderated=False))

这些查询将非常激烈,因为这将是一个分析和报告仪表板,quires将非常严重地打击数据库。

在这种情况下处理复杂查询的最佳方法是什么?即,当您有一个基本查询时,它将在短时间内经常切片和切块,永远不会再次使用。

我们拥有的一些可能的解决方案是

  1. 只读数据库和只写数据库。
  2. 编写Raw sql查询并使用它们。由于django ORM对于某些类型的查询效率非常低。
  3. 大量缓存(没有对此进行过任何研究。)
  4. 编辑:例如查询

    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。基本上我们会对基本查询进行切片和切块。

    您可以指出我们是否有任何其他可能的解决方案或方法。任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

我可以想到准备好的陈述和更快的服务器,可能在linux上......