mysql чем отличается первичный ключ от индекса?

Изучаю индексы в mysql, что то не могу разобраться,
primary key - представляет собой уникальный индекс и применяется для уникальной идентификации записей таблицы. Никакие из двух записей таблицы не могут иметь одинаковых значений первичного ключа.

и просто INDEX [index_name] (index_col_name,...) - значения, которые содержатся в таких полях также не могут повторяться и иметь значение NULL.

так в чем разница ?

1 ответов


Разница в том, что первичный ключ - это понятие больше логическое, а индекс - это физическая структура на диске. В теории необязательно по столбцу первичного ключа должен быть построен индекс и вообще необязательно столбец в СУБД обозначать как первичный ключ. На практике обычно по умолчанию для столбца первичного ключа создается кластерный индекс. Отсюда часто и путаница, что первичный ключ и индекс это одно и тоже. Задача кластерного индекса - это упорядочивание строк по значению ключа. Плюс кластерный индекс упрощенно говоря будет храниться вместе с данными других столбцов записи таблицы и не занимать дополнительное место на диске, т.е. по сути кластерный индекс в таком случае и значение столбца первичного ключа это одно и тоже.Для некластерного или просто индекса будет создана дополнительная структура, которая будет физически храниться отдельно от таблицы и занимать место на диске. Иногда некластерный индекс может быть больше самой таблицы по размеру. Кластерный индекс по размеру больше таблицы не может быть. Кроме того, некластерный индекс будет изменяться при изменении строк в таблице. Индекс с ограничением по уникальности значения и первичный ключ в основе своей имеют одинаковую логику работы, но первичный ключ - это требование реляционной модели построения БД, а ограничение по уникальности - это бизнес-требование. Например, таблица пользователей с уникальным адресом электронной почты.
В общем, по большому счету, разница будет в том, что как храниться на диске. Вот как-то так:-)