Django模型在一个字段上过滤并在另一个字段上排序时的最佳索引
我使用链接到PostgreSQL的Django 2.2,并希望优化我的数据库查询。 鉴于以下简化模型: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') 为了优化查询,在模型元字段中定义索引的最佳方法是什么?
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的格式可能很重要
class Meta
indexes = [models.Index(fields=['age', 'name'])]
然后在dbshell中运行解释分析,看看它是否有效 谢谢,但是我是否也应该为“name”创建一个索引,这样在查询时就不需要排序了?不,您只需要为字段创建一个索引,您可以为类似的示例在SQL中如何为该字段设置数据集。以Django为例,我只是不知道该怎么做。谢谢你让我走上正轨。我将按照建议进行测试。(不幸的是,我的支持票还不算在内。)@GCru-这个答案被证明有用吗?如果是,请记住将答案标记为“已接受”