Почему 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
Ключевое слово при создании таблицы, так почему он делает это для ManyToManyField
?
Если индексы действительно избыточны, означает ли это, что каждая запись запускает дополнительные записи в таблицу индексов или достаточно ли умна БД для обнаружения дубликатов?