gpt4 book ai didi

django - 使用 Django 的 unique_together 避免重复的数据库索引

转载 作者:行者123 更新时间:2023-11-29 12:26:50 25 4
gpt4 key购买 nike

我有一个项目在 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"), )

据我了解:

  1. 字段 x 是外键,因此除非另有要求,否则 Django 会自动为 (x) 添加数据库索引
  2. 由于 unique_together 语句,PostgreSQL 隐式生成了 (x, y) 的组合索引
  3. 通常,(x, y) 的索引也可以作为 (x) 的索引
  4. 重复索引在 SQL INSERT 操作中消耗额外的时间

我的结论是,在这种情况下,最好为字段 x 显式声明 db_index=false,以避免重复索引。

这是一个有效的结论吗?

最佳答案

根据 documentation ,(x, y) 上的索引也将用作针对 x 的查询的索引。由于索引将 x 作为第一列,因此它也比 (y, x) 更有效。所以从这个意义上说,你是对的。

具有多个索引的表将在插入时消耗更多时间,因为将更新更多索引。时间长短取决于表结构。

最终取决于y将产生的数据量。如果 y 有很多变化,则索引大小可能比仅 x 的索引大很多。在这种情况下,基于该索引的查询将导致从该索引加载和处理更多数据。如果变化很小并且索引大小不会大很多,那么只使用 (x, y) 索引可能会更好。

但是,一如既往,这需要基准、基准和基准。

数据完整性注意事项

如果您决定删除 x 上的索引并且只有 (x, y) 上的唯一索引,那么只要 y 不同,x 本身可能包含非唯一值。根据实现情况,这可能重要也可能不重要。

关于django - 使用 Django 的 unique_together 避免重复的数据库索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30368135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com