@HellWalk

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

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

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


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


Но никак последнее утверждение не поясняется. Зачем явно создавать колонку с первичным ключом, если она так и так будет создана?
  • Вопрос задан
  • 770 просмотров
Решения вопроса 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 индекс выберет то это вообще ппц будет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы