Этот набор индексов
PRIMARY KEY(contract_id)
INDEX(user_id, provider_id, contract_id),
INDEX(provider_id, user_id, contract_id)
Обеспечивает:
- Остальное, что нужно
AUTO_INCREMENT
, а именно contract_id
, чтобы быть первым столбцом в некотором индексе.
- Эффективный способ получить доступ от пользователя ко всем его поставщикам и наоборот (в виде таблицы «многие ко многим»).
Это также будет работать:
PRIMARY KEY(user_id, provider_id, contract_id),
INDEX(provider_id, user_id, contract_id)
INDEX(contract_id)
Примечания:
- Не применяется
UNIQUEness
из contract_id
, но это не должно быть проблемой, если вы используете AUTO_INCREMENT
обычным способом (никогда INSERTing
явное значение).
- Предоставляет ссылки, начинающиеся с каждого столбца.
Я не знаю, как правильно нарисовать модель. В какой-то момент схема должна быть реализована, и , которая становится источником истины о том, как работает схема.
При реализации InnoDB любая тройка индексов становится 3 BTrees, каждый из которых содержит все столбцы, но расположены по-разному. То есть SELECTs
должен найти либо тройной идентичный по производительности. INSERTs
вставит в «конец» BTree для contract_id и вставит в различных местах для двух других BTree. Опять же, нет различий в производительности.
Подробнее о таблицах "многие ко многим" здесь .