Django 1.11中的数据库索引:db_true,索引和index_together之间的差异

cud*_*cos 13 python django django-orm django-1.11

Django 1.11提供了创建数据库索引的新方法.到目前为止,我们db_index=True在每个领域都有:

# example 1

class Person(models.Model):
    name = models.CharField(db_index=True)
    age = models.IntegerField(db_index=True)
Run Code Online (Sandbox Code Playgroud)

现在我们已经models.Index和可能indexesclass Meta块内声明- 甚至是index_together.

那说我有两个疑问:

1.示例1中的代码是否与下面的示例2完全相同?

# example 2

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        indexes = [
            models.Index(fields=['name']),
            models.Index(fields=['age'])
        ]
Run Code Online (Sandbox Code Playgroud)

2. index多个字段怎么样index_together?下面的例子3和4做了完全相同的事情?

# example 3

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        indexes = [
            models.Index(fields=['name', 'age'])
        ]
Run Code Online (Sandbox Code Playgroud)
# example 4

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        index_together = [['name', 'age']]
Run Code Online (Sandbox Code Playgroud)

1和2之间有什么不同,3和4之间的差异是什么?我错过了什么?非常感谢.

Rub*_*arí 7

根据文档,您可以给索引命名,也可以为索引中的每个字段设置顺序(但并非同样支持所有DB)。但实际上,这样做的全部目的是带来额外的灵活性,以在支持的情况下定义其他类型的索引。

当前从Django 1.11开始,只有在使用Postgres时,您才可以定义GIN和BRIN索引(如果这符合您的需求)。(请参阅django.contrib.postgres.indexes,网址https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/

能够按照您所描述的那样定义索引只是最常见的情况,除非您想使用上面命名的功能(命名索引或排序字段),否则可能可以像到目前为止一样使用索引(db_index和index_together)。

  • 令我感到惊讶的是,新的`indexes`功能只是推广了`db_index`和`index_together`。他们可以将处理它们的经典方法转换为新方法,并添加一些告诉Django它们等效的检查。我想还有一些其他技术原因,我不知道他们为什么决定不采用这种方式。也许其他人可以在这里找到一些启示。 (2认同)
  • 找到了这个博客 - https://markusholtermann.eu/2017/04/to-index-or-not-is-not-the-question/。必读。 (2认同)