index_together 的顺序在 Django 模型中是不是重要?

Posted

技术标签:

【中文标题】index_together 的顺序在 Django 模型中是不是重要?【英文标题】:Does the order of index_together matter in a Django model?index_together 的顺序在 Django 模型中是否重要? 【发布时间】:2014-03-12 07:11:13 【问题描述】:

使用 index_together 元属性定义模型时,列的顺序是否重要?

也就是说,有没有区别

Class myModel(models.Model):
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    favorite_color = models.CharField(max_length=20)

    class Meta:
        index_together = ('name', 'address', 'favorite_color')

Class myModel(models.Model):
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    favorite_color = models.CharField(max_length=20)

    class Meta:
        index_together = ('favorite_color', 'name', 'address')

我之所以这么问,是因为我在查看表的结构时注意到,键中的每一列都有一个“键中的索引”属性。 mysql/PostgreSQL 是否希望按该顺序查询列?

顺便说一句,将列索引在一起与单独索引有很大区别吗?

【问题讨论】:

【参考方案1】:

index_together 的顺序解释了创建索引的“路径”。 您可以从左到右查询以从索引中获利。

所以你的第一个index_together

    index_together = ('name', 'address', 'favorite_color')

如果您的第一个过滤器是name,则使用索引。如果第一个是name,第二个是address,则也使用索引。

但如果你按address 过滤,然后nameaddressfavorite_color 则无法使用索引。

【讨论】:

索引是否仍然可以用于多对多关系?假设Recipe 是带有Ingredients 的ManyToMany,并且成分在('type', 'flavor') 上具有索引或其他内容。如果我有一个recipe 的实例,像recipe.ingredient_set.filter(type='cheese', flavor='mozzarella') 这样的东西会使用索引吗?如果索引改为('recipe', 'type', 'flavor') 会怎样?再次感谢! 那“如果索引不是”应该是('id', 'type', 'flavor')。我的错。 @omeinusch 似乎回答这个问题的正确方法是说明 index_together 语句如何映射到带有迁移的 CREATE INDEX 语句,无论是 South 还是 Django 1.7+ - 你知道吗? @MarkChackerian 如果您还有其他问题,请随时提问。但我认为,cmets 不是正确的地方。如果您知道答案,请随时编辑。在提出问题的时候,Django 1.7 没有发布。 我深入研究了 Django 源代码来回答我自己的后续问题,并确认 Django 做了正确的事情——生成的 CREATE INDEX 语句中的列顺序与index_together 声明中列出的字段——见github.com/Architizer/application/commit/… & github.com/django/django/blob/…

以上是关于index_together 的顺序在 Django 模型中是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

Djang视图层

djang2.1大战教育平台之交互篇章

Djang DJANGO_SETTINGS_MODULE

Djang

Djang_Q搜索

djang增删改查