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
过滤,然后name
或address
,favorite_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 模型中是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章