В отношениях один к нулю/один (MySQL, InnoDB) есть ли какие-либо улучшения производительности за счет использования внешнего ключа в качестве первичного ключа?

Итак, чтение этого старого Сообщение блога (который, честно говоря, довольно старый) дало мне некоторые мысли о том, как структурировать некоторые из моих связей между таблицами.

Если какой-либо поиск по вторичному индексу содержит первичный ключ, а первичный ключ — это то, что обращается к данным строки, то для такого рода схемы

Users : id, name, country, etc.

User_Mailboxes : id, user_id, location, height, etc.

Если у пользователя может быть или не быть почтовый ящик, но не более одного, было бы более эффективно избавиться от «идентификатора» в качестве первичного ключа таблицы user_mailboxes и установить внешний ключ в качестве первичного ключа?

Насколько я понимаю InnoDB, таким образом мы сохранили бы любые поиски вторичного индекса для соответствующего первичного ключа и могли бы напрямую использовать User.id для поиска соответствующей информации о почтовом ящике.

Так что что-то более похожее на это,

Users : id (PRIMARY), name, country, etc.

User_Mailboxes : user_id(FOREIGN, PRIMARY), location, height, etc.

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

Покажите нам важные запросы.

Rick James 26.05.2019 16:32
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
1
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В отношениях 1:0..1 вы можете (и должны) делать это, да. Я бы тоже так сделал. Хранить ненужную информацию в любом случае нехорошо.
Но не разочаровывайтесь, если вы не получите столько производительности, как вы думаете. Когда вы не захватываете действительно большое количество пользователей/почтовых ящиков одновременно, вы не заметите многого или вообще ничего.

  • FOREIGN KEYзамедляет вставляется из-за выполненной проверки. (Но это незначительный удар по производительности.)

  • Ничто не «требует» существования каких-либо ФК. (Кроме некоторых учебников.)

  • FOREIGN KEY неявно создает INDEX (если он еще не существует).

  • INDEXes может иметь большое значение для производительности SELECTs.

  • Этот трюк может переместить «важные» запросы в PRIMARY KEY. Хитрость заставляет выборку по диапазону в PK использовать преимущества кластеризации.

      -- Instead of
    PRIMARY KEY (id),
    INDEX (foo)
      -- change to
    PRIMARY KEY (foo, id),   -- `id` included to achieve UNIQUEness
    INDEX (id)   -- to keep AUTO_INCREMENT happy
    
  • Если у вас есть «естественный» первичный ключ, используйте его и выбросьте auto_increment. (В некоторых случаях это помогает в целом; в некоторых случаях это вредит.)

Другие вопросы по теме