[Хд] logo

Primary Keys в MySQL

Табличный движок Innodb обладает целым рядом нюансов при работе с первичными ключами (Primary Keys). Знание этих нюансов поможет эффективнее использовать ресурсы железа.

Кластерные индексы

В Innodb первичный ключ является кластерным. Это означает, что вся запись хранится вместе с этим ключом. Это позволяет получить преимущество при чтении по первичному ключу — для получения всех данных происходит только одна операция поиска (lookup).

Таблицы без первичного ключа

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

Последовательная вставка

Innodb хранит данные в страницах. При создании новых записей, страница заполняется почти полностью (оставляя немного на возможные будущее изменения внутри страницы). Последовательная вставка (auto increment primary key) обеспечивает хорошую заполненность страниц и, как следствие, лучшую производительность вставки и чтения.

Первичный ключ и другие индексы

Любой индекс также сохраняет значение первичного ключа. Это позволяет делать эффективные выборки первичных ключей при поиске по другим индексам без дополнительной операции поиска.

Самое важное

  • Во всех innodb таблицах всегда должен быть явно указан первичный ключ.
  • Первичным ключом должна быть самая маленькая по размеру колонка. Это сэкономит кучу места, т.к. значение первичного ключа сохраняется в каждом индексе. Если вам нужен smallint, не используйте int и т.п.
  • Используйте в качестве первичного ключа auto_increment колонку — это позволит значительно снизить фрагментацию страниц и повысить скорость записи и чтения. Тем более не стоит ставить primary key на несколько колонок. Лучше использовать UNIQUE INDEX + auto_increment колонку для PK.
[Хд]

Подписывайтесь на отборные материалы по продвинутой разработке

Google Email

Esc, чтобы подписаться позже