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

标签 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 Meta
        indexes = [models.Index(fields=['age','name']),
                   models.Index(fields=['name','age']),
                   models.Index(fields=['name']),
                   models.Index(fields=['age'])]

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

最佳答案

这真的是一个 postgres 问题,就像 Django 问题一样,对吧?

我认为很有可能在排序字段上创建索引有助于提高性能。但是有很多注意事项,如果它对您来说真的很重要,您可能想做一些针对 Postgres 的测试(即,只需在 psql 中运行一些查询,看看会发生什么)。一些注意事项包括:

  • 这可能取决于 Django 为您创建的索引类型
  • 当然,Postgres 在运行查询时并不总是使用索引,但如果您有正确的查询和正确的查询(并且表中有足够的数据来证明加载索引是合理的),它应该使用索引
  • 可能 Django 如何格式化您的 SELECT

我建议您创建模型并指定您需要索引。然后使用 Django 调试工具栏找出真正运行的 SELECT 查询。然后,使用 manage.py dbshel​​l(又名 psql)打开一个 dbshel​​l,并使用相同的选择运行 ANALYZE。假设您可以解释输出,您将亲眼看到您的索引是否发挥作用。如果您愿意,可以在此处粘贴 ANALYZE 输出。

根据这个Postgres documentation ORDER BY 可以由 btree 索引辅助。 b-tree 类型的索引是 Django 默认为您创建的。

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

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

然后在 dbshel​​l 中运行一个EXPLAIN ANALYZE,看看它是否有效。

关于django - 在一个字段上过滤并在另一个字段上排序时 Django 模型的最佳索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58932285/

相关文章:

javascript - 检查属性名称是否为数组索引

sql - 非聚集行索引和列存储索引的区别

php - SQL 棘手的顺序

php - 按贝叶斯评级排序数据库结果

python - 实现新闻源的有效方法

python - 不正确的值 - 在 Django 中建模的 python

python - Pandas 平均轴参数

SQL 查询按自定义顺序排序

python - django haystack/whoosh : find records with umlauts/diaeresis, 带有简单的 ascii 查询

django - 图片上传指令(angularJs 和 django rest 框架)