Нужны индексы по внешним ключам

30

Я борюсь с индексами, первичными ключами и внешними ключами ... И необходимостью иметь их все.

Если у меня есть две таблицы, обе они имеют целое число в качестве первичного ключа.
Первая таблица ссылается через FK на первичный ключ второй таблицы.

  • В обеих таблицах у меня есть индекс первичного ключа в столбце ID
  • Я создал ограничение FK для table1.ref_fieldссылки на PK второй таблицы ( table2.id)
  • и я добавил индекс table1.ref_field

Это лучший способ организовать эти индексы, первичные и внешние ключи?

stUrb
источник

Ответы:

30

Ваш дизайн хорош. Если у вас есть проблема с производительностью (которую вы не можете знать во время разработки), вы должны создать индекс для столбца table1.ref_field в том же порядке (ASC), что и столбец table2.id. Это улучшит производительность при соединениях между этими таблицами / столбцами. Поддержание любого индекса сопряжено с дополнительными затратами, поэтому вы хотите сопоставить эти затраты с преимуществами повышения производительности.

PostgreSQL, к сожалению, не создает автоматически такие индексы для столбцов с внешним ключом, которые ссылаются на другие столбцы, поэтому вам придется делать это самостоятельно.

Вот вопрос StackOverflow по той же теме:

Postgres и индексы для внешних ключей и первичных ключей

Вот запрос, который поможет определить, где вы могли бы получить выгоду от добавления такого индекса:

Postgresql: индексы для внешних ключей

peterk411
источник
Это не всегда прискорбно - если вы этого не сделаете DELETEиз таблицы, на которую ссылаются, это может сэкономить вам много ввода-вывода и ЦП, избегая поддержания неиспользуемого индекса. Я думаю, что он должен быть создан по умолчанию, просто есть возможность подавить его создание.
Крейг Рингер
Крейг Рингер Не только DELETE может повлиять на это, если у вас есть выбор из родительских таблиц, у вас также будут проблемы с производительностью. Эта документация от Oracle объяснить подробнее: asktom.oracle.com/pls/asktom/...
777Anon