Django模型在一个字段上过滤并在另一个字段上排序时的最佳索引

Django模型在一个字段上过滤并在另一个字段上排序时的最佳索引,django,indexing,sql-order-by,django-queryset,Django,Indexing,Sql Order By,Django Queryset,我使用链接到PostgreSQL的Django 2.2,并希望优化我的数据库查询。 鉴于以下简化模型: class Person(model.Models): name = models.CharField() age = models.Integerfield() 我必须对其进行以下查询,比如 Person.objects.filter(age__gt=20, age__lt=30).order_by('name') 为了优化查询,在模型元字段中定义索引的最佳方法是什么?

我使用链接到PostgreSQL的Django 2.2,并希望优化我的数据库查询。 鉴于以下简化模型:

class Person(model.Models):
    name = models.CharField()
    age = models.Integerfield()
我必须对其进行以下查询,比如

Person.objects.filter(age__gt=20, age__lt=30).order_by('name')
为了优化查询,在模型元字段中定义索引的最佳方法是什么? 这四个选项中哪一个最好

    class Meta
        indexes = [models.Index(fields=['age','name']),
                   models.Index(fields=['name','age']),
                   models.Index(fields=['name']),
                   models.Index(fields=['age'])]

例如,在查询完成时是否可能阻止排序?谢谢。

这真的是一个博士后的问题,就像一个Django问题一样,对吗

# You should apply indexing on age, because you are searching for 'age' column data

indexes = [
    models.Index(fields=['age'])
]
我认为在排序字段上创建索引很有可能有助于提高性能。但是有很多警告,如果这对你来说真的很重要,你可能想做一些专注于Postgres的测试(即,在psql中运行一些查询,看看会发生什么)。一些警告包括:

  • 这可能取决于Django为您创建的索引类型
  • 当然,Postgres在运行查询时并不总是使用索引,但如果您使用了正确的索引和正确的查询(并且表中有足够的数据来证明加载索引的合理性),则应该使用索引
  • Django对SELECT的格式可能很重要
我建议您创建模型并指定您想要索引。然后使用Django调试工具栏找出真正运行的SELECT查询。然后,使用manage.py dbshell(又名psql)打开一个dbshell,并使用相同的选择运行ANALYZE。假设您可以解释输出,您将亲自查看索引是否发挥作用。如果愿意,请将分析输出粘贴到此处

根据这个顺序,可以通过一个btree索引来辅助。默认情况下,Django将为您创建b树类型的索引

那么,你为什么不试试这个呢:

class Meta
    indexes = [models.Index(fields=['age', 'name'])]

然后在dbshell中运行解释分析,看看它是否有效

谢谢,但是我是否也应该为“name”创建一个索引,这样在查询时就不需要排序了?不,您只需要为字段创建一个索引,您可以为类似的示例在SQL中如何为该字段设置数据集。以Django为例,我只是不知道该怎么做。谢谢你让我走上正轨。我将按照建议进行测试。(不幸的是,我的支持票还不算在内。)@GCru-这个答案被证明有用吗?如果是,请记住将答案标记为“已接受”