@HellWalk

Почему во всех innodb рекомендуют явно задавать PRIMARY KEY?

В этом руководстве пишется следующее:

В Innodb не может не быть первичного ключа. Если вы не укажите его, Mysql сделает это за вас. Сначала Mysql попытается взять первый уникальный индекс (UNIQUE INDEX). Если не получится — создаст скрытую колонку (из 6ти байт) и назначит ее первичным ключом


Во всех innodb таблицах всегда должен быть явно указан первичный ключ.


Но никак последнее утверждение не поясняется. Зачем явно создавать колонку с первичным ключом, если она так и так будет создана?
  • Вопрос задан
  • 788 просмотров
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Зачем явно создавать колонку с первичным ключом, если она так и так будет создана?

Если говорить конкретно об этом, то вот Jeremy Cole доходчиво объясняет:

Вопрос в доступности. Созданное за нас будет недоступно для запросов. То есть лучше иметь явно заданное поле, которое можно использовать в запросах, чем недоступное поле, которое будет тупо занимать место в памяти.

Опять же, первичный ключ может быть только один, то есть если потом мы спохватимся и захотим добавить, то уже не получится.
Ответ написан
Комментировать
gobananas
@gobananas
finishhim.ru
Посмотрите статью с ruhighload если кратко то:
1) Он всё равно будет создан
2) Не делайте первичный ключ составным или на поле типа varchar, т.к. его копия хранится в остальных индексах то вы получите перерасход памяти

И ещё из статьи https://habrahabr.ru/post/141767/ цитата:

Каждая таблица InnoDB имеет кластерный ключ. Каждая. Без исключения.

Гораздо интереснее, какие поля для этого выбираются.

Если в таблице задан PRIMARY KEY — это он
Иначе, если в таблице есть UNIQUE (уникальные) индексы — это первый из них
Иначе InnoDB самостоятельно создаёт скрытое поле с суррогатным ID размером в 6 байт

До третьего пункта лучше не доводить свой многострадальный сервер, и добавить таки ID самостоятельно.

И не забывайте, что InnoDB во вторичных ключах хранит полный набор значений полей кластерного ключа в качестве ссылки на конечную строку в таблице. Чем больше первичный ключ, тем больше вторичные ключи.


Т.е. INT поле которого вам хватит для 4 млрд. айдишников занимает 4 байта, MEDIUMINT 3 байта, а суррогатное 6 байт. Ну а если он первый UNIQUE varchar индекс выберет то это вообще ппц будет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы