Для чего нужен составной ключ в mysql?
========================================

 Для чего нужен составной ключ в mysql? Можете пожалуйста объяснить и привести понятный пример, в котором можно увидеть необходимость использования составного ключа. 

 У меня например есть таблица "права доступа".  
  

access (id,user\_id,access\_mode)  

У одного пользователя не может быть два раза одно и тоже значение access\_mode ( зачем допускать пользователя 2 раза к одному и тому же разделу сайта?)  
  

Потому я использую двойной ключ (user\_id,access\_mode) 

 Составные ключи могут служить заменой специально вводимым идентификаторам.  

Например есть таблица Пользователи вида Users(id, name) и таблица Фотки вида Photos(id, name).  
  

Таблица содержащая фотки пользователей будет таблица UsersPhotos(user\_id, photo\_id). В данном случае эти два поля образуют составной ключ, эта связка будет уникальна и нет смысла вводить избыточный идентификатор, если этого не требует логика приложения. 

 Если ключ primary, то, как уже ответили, чтобы использовать уникальную комбинацию полей вместо auto\_increment.  

А если речь идёт об индексе, то mysql не умеет их комбинировать. Соответственно, если вам нужна фильтрация, например, по тэгу статьи и дате публикации, и это частый запрос, то вам придётся добавить составной индекс. Причём, порядок имеет значение - key(tag\_id, tm) не будет использоваться в запросах с tm, но без tag\_id в where. 

 Составной ключ (индекс) нужен как и все индексы для ускорения выборки. Его можно не использовать и для каждого поля создать свой, но работать они будут медленее, чем составной и будет больше оверхеда на их поддержку.  

Т.е. составной ключ нужен если у вас много выборок вида Поле1->Поле2->Поле3... При этом как уже отметил [kilgur](http://toster.ru/user/kilgur) порядок полей имеет значение и работать будет быстро только префиксный вариант. 

 Очень хороши составные ключи для таблиц с соотношениями типа многие-ко-многим. Например: есть таблица с авторами и таблица с книгами, но т.к. у одной книги может быть несколько авторов и у одного автора несколько книг, то сопоставление автор/книга мы можем хранить с таблице типа many-to-many. Вводить для неё суррогатный ключ (все эти id INT INSUGNED PRIMARY KEY AUTO\_INCREMENT) совершенно не нужно - в качестве ключа можно взять комбинацию первичных ключей из таблиц авторов и книг.  
  

А если мы имеет таблицу many-to-many, которая сопоставляет две других таблицы с естественными ключами, и выбрали для many-to-many составной ключ, являющийся, таким образом, комбинацией двух естественных ключей, то иногда получается вообще избавиться от лишнего JOIN при запросе, что очень неплохо, потому что самая важная информация уже есть в самом ключе.