Django 1.11 中的数据库索引:db_true、索引和 index_together 之间的区别

Database indexes in Django 1.11: difference between db_true, indexes and index_together

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

# example 1

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

现在我们有 models.Index 并且可以在 class Meta 块中声明 indexes — 甚至 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'])
        ]

2。具有多个字段的 indexindex_together 怎么样:下面的示例 3 和 4 是否做完全相同的事情?

# example 3

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

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

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

    class Meta:
        index_together = [['name', 'age']]

1和2有什么区别,3和4有什么区别?我错过了什么?非常感谢。

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

目前从 Django 1.11 开始,并且只有在使用 Postgres 时,您才可以定义 GIN 和 BRIN 索引,如果这符合您的需要的话。 (参见 https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/ 处的 django.contrib.postgres.indexes)

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