19

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可能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'])
        ]

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'])
        ]
# example 4

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

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

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

4

1 回答 1

10

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

目前从 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)。

于 2017-06-19T12:53:12.923 回答