Использование GUID в качестве PK в большой многораздельной таблице MySQL - PullRequest
6 голосов
/ 22 июня 2011

У нас огромная таблица InnoDB с сотнями миллионов строк и всего 3 столбцами: GUID, enum, smallint. Все поиски выполняются по GUID.

Мы рассматриваем создание GUID для PK и разбиение его по ключам.

Мы слышали, что использование GUID в качестве PK нецелесообразно из-за его случайного распределения и того факта, что PK создает кластерный индекс. Поэтому хранение строк в произвольном порядке идентификаторов GUID увеличивает фрагментацию и разбиение страниц.

Альтернативой использованию GUID в качестве PK является создание суррогатного ключа автоинкремента и его использование в качестве PK. Однако, если мы хотим разделить таблицу по GUID, этот GUID также должен быть частью PK. Кроме того, поскольку все запросы выполняются по GUID, нам нужен дополнительный индекс GUID. Этот индекс по существу отображает GUID-> PK, в то время как если мы используем GUID в качестве PK - сама таблица отображает GUID-> enum + small int?

Итак, мой вопрос: можем ли мы получить что-нибудь, добавив auto-inc PK и получив дополнительный индекс GUID?

Спасибо, Филопатор.

1 Ответ

2 голосов
/ 08 ноября 2011

Проблема с использованием GUID в качестве PK в InnoDB заключается не только в том, что распределение GUID является случайным. Дело в том, что записи в InnoDB хранятся в порядке первичного ключа. Это означает, что в дизайне таблиц, о котором вы говорите, InnoDB будет постоянно перемещать данные, пытаясь отсортировать ваши GUID. Вам следует использовать таблицу перевода, которая отображает GUID на int или bigint, и использовать ее в качестве PK.

...