为什么Django会创建冗余索引?

时间:2016-03-01 18:24:42

标签: python sql django

Django模型

class UserProfile(models.Model):
    user = models.OneToOneField(AUTH_USER_MODEL, on_delete=models.CASCADE)
    followers = models.ManyToManyField("self", symmetrical=False)

生成此SQL

CREATE TABLE "tweets_userprofile" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "user_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id"));
CREATE TABLE "tweets_userprofile_followers" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "from_userprofile_id" integer NOT NULL REFERENCES "tweets_userprofile" ("id"), "to_userprofile_id" integer NOT NULL REFERENCES "tweets_userprofile" ("id"));
CREATE UNIQUE INDEX "tweets_userprofile_followers_from_userprofile_id_a8c8e3db_uniq" ON "tweets_userprofile_followers" ("from_userprofile_id", "to_userprofile_id");
CREATE INDEX "tweets_userprofile_followers_6c3c534c" ON "tweets_userprofile_followers" ("from_userprofile_id");
CREATE INDEX "tweets_userprofile_followers_257192e2" ON "tweets_userprofile_followers" ("to_userprofile_id");

我知道唯一的索引可以防止重复。

虽然(from_userprofile_id, to_userprofile_id)上的索引和(from_userprofile_id)上的索引都是多余的?

此外,没有REFERENCES关键字会自动创建索引,因为它们是外键吗?在使用ForeignKey编写模型时,Django在创建表时除了CREATE INDEX关键字之外不会生成任何额外的REFERENCES语句,那么为什么它会为{{1}执行此操作}}?

如果索引确实是冗余的,这是否意味着每次写入都会触发额外的索引表写入,或者DB是否足够聪明地检测重复项?

0 个答案:

没有答案