MySQL. Первичный ключ в реляционной таблице. Уникальный идентификатор или несколько уникальных ключей?

Первичный ключ в реляционных таблицах. Составной первичный ключ или уникальный первичный ключ в этих чистых реляционных таблицах?

Какой дизайн вы бы порекомендовали использовать в MySQL для повышения производительности? См. схему

Технические преимущества и недостатки!

Всем спасибо!


person Emilio Nicolás    schedule 16.06.2011    source источник
comment
Очень похоже на stackoverflow.com/questions/6355479/   -  person Neville Kuyt    schedule 16.06.2011
comment
Если вам нужна производительность, полностью удалите внешние ключи. Если вам нужен правильный дизайн базы данных и модель отношений — используйте ту, которая работает, не думая о влиянии на производительность.   -  person Michael J.V.    schedule 16.06.2011
comment
Если вам нужна производительность, полностью удалите внешние ключи. Это было бы глупо. Внешние ключи могут повысить производительность за счет улучшения плана выполнения некоторых запросов. В любом случае схема без ограничения функционально не эквивалентна схеме с ним, поэтому начинать сравнивать производительность между ними немного произвольно.   -  person nvogel    schedule 16.06.2011


Ответы (3)


Это действительно зависит от типа запроса, который вы делаете...

Если вы добавите дополнительный суррогат, вам придется выполнять две уникальные проверки вместо одной для каждой вставки, обновления и удаления. Это заставляет композитный ключ звучать правильно.

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

person Denis de Bernardy    schedule 16.06.2011

Согласно Эльмасри и Навате (в Основах систем баз данных), вам следует выбрать вариант A, поскольку искусственные первичные ключи не нужны и предполагают, что у вас денормализованный дизайн (их POV).

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

Я не думаю, что последствия производительности для таблицы соединений огромны.

person Brian Driscoll    schedule 16.06.2011

Я согласен с @Denis, это будет зависеть от того, что вы делаете. Еще одна вещь, которую следует учитывать, заключается в том, что InnoDB будет хранить строки на диске в порядке PK. Это очень важно, если вы делаете такие вещи, как id1 BETWEEN a AND b. Перемещение этих головок чтения занимает около 10 мс каждый раз, и если строки для вашего запроса разбросаны, они складываются. Именно по этим причинам вы можете подумать о денормализации, чтобы поместить нужные вам данные в одну строку.

person Joshua Martell    schedule 16.06.2011
comment
ссылка на доказательство того, что innodb будет хранить строки в порядке PK на диске? не похоже на разумную вещь для этого. - person ysth; 30.07.2013
comment
Кластерный индекс InnoDB — это индекс + данные в следующем порядке: dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html - person Joshua Martell; 01.08.2013