Почему 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?

Если индексы действительно избыточны, означает ли это, что каждая запись запускает дополнительные записи в таблицу индексов или достаточно ли умна БД для обнаружения дубликатов?

0 ответов

Другие вопросы по тегам