我有一个在PostgreSQL v9.4和Django 1.6上运行的项目(计划很快升级到v1.8 ......)
假设我有以下型号:
class Product(models.Model):
x = models.ForeignKey(Shop)
y = models.PositiveIntegerField()
class Meta:
unique_together = (("x", "y"), )
据我所知:
我的结论是,在这种情况下,最好为字段x显式声明db_index = false,以避免重复索引。
这是一个有效的结论吗?
答案 0 :(得分:0)
根据documentation,(x,y)上的索引也将作为针对x的查询的索引。由于索引将x作为第一列,因此它也比(y,x)更有效。所以从这个意义上说你是对的。
具有多个索引的表将在插入时消耗更多时间,因为将更新更多索引。时间量取决于表格结构。
最后,它取决于y将导致的数据量。如果y上有很多变化,则索引大小可能比x上的索引大很多。在这种情况下,基于此索引进行查询将导致从索引加载和处理更多数据。如果变化较小且索引大小不是很大,那么只需要(x,y)索引就可能更好。
但是,与往常一样,这需要基准测试,基准测试和基准测试。
有关数据完整性的说明
如果您决定在x上删除索引并且只在(x,y)上具有唯一索引,那么只要y不同,x本身可能包含非唯一值。根据具体实施情况,这可能也可能不重要。