В типичной схеме «многие-многие», подобной этой ...
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?