Как правильно проиндексировать таблицу ассоциаций "многие-многие"?

В типичной схеме «многие-многие», подобной этой ...

Movies       Actors       Movies_Actors
------       ------       -------------
movie_ID     actor_ID     FK_movie_ID
title        name         FK_actor_ID

... как должна индексироваться таблица ассоциаций ( 'Movies_Actors' ) для обеспечения оптимальной скорости чтения?

Обычно я вижу, что это делается только с составным первичным ключом в таблице ассоциаций, например:

CREATE TABLE Movies_Actors (
  FK_movie_ID INTEGER,
  FK_actor_ID INTEGER,
  PRIMARY KEY (FK_movie_ID, FK_actor_ID)
)

Однако похоже, что индекс будет полезен только при поиске как movie_ID , так и Actor_ID (хотя я не уверен, работает ли составной индекс также для отдельных столбцов).

Поскольку и «какие актеры находятся в фильме X», и «в каких фильмах снимался актер Y» будут обычными запросами для этой таблицы, кажется, что в каждом столбце должен быть отдельный индекс, чтобы быстро находить актеров и фильмы самостоятельно. Эффективно ли это делает составной индекс? Если не, иметь составной индекс для этой таблицы бессмысленно. А если составной индекс бессмысленен, что делать с первичным ключом? Ключ-кандидат явно представляет собой составную часть двух столбцов, но если результирующий составной индекс бессмыслен (а не должен быть?), Это кажется пустой тратой.

Кроме того, эта ссылка добавляет некоторую путаницу. и указывает, что может быть даже полезно фактически указать два составных индекса ... один из них как (FK_movie_ID, FK_actor_ID) , а другой в обратном порядке как (FK_actor_ID , FK_movie_ID) , выбор которого является первичным ключом (и, следовательно, обычно кластеризованным), и который является «просто» уникальным составным индексом, основанным на том, в каком направлении запрашивается больше.

Какова реальная история? Действительно ли составной индекс автоматически эффективно индексирует каждый столбец для поиска по одному или другому? Должна ли оптимальная (по скорости чтения, а не по размеру) таблица ассоциации иметь составной индекс в каждом направлении и по одному в каждом столбце? Каковы закулисные механизмы?


РЕДАКТИРОВАТЬ: Я нашел этот связанный вопрос, который по какой-то причине я не нашел перед публикацией ... Как правильно проиндексировать таблицу связывания для соединения «многие ко многим» в MySQL?

19
задан Community 23 May 2017 в 11:54
поделиться