Символ против целочисленных первичных ключей

30

Я проектирую базу данных с несколькими справочными таблицами, содержащими возможные атрибуты основных объектов. Я подумываю об использовании 4 или 5-символьного ключа для определения этих значений поиска, а не целого числа с автоматическим увеличением, чтобы при сохранении этих идентификаторов атрибутов в основных таблицах я видел значимые значения, а не только случайные числа.

Каковы показатели производительности использования символьного поля в качестве первичного ключа, а не целого числа?

Я использую MySQL, если это имеет значение.

[Редактировать] В
этих таблицах поиска новые записи добавляются нечасто. Они поддерживаются вручную, а также создаются ключи на основе символов. Вот пример:

      CUISINES
 ID      Description
-----  --------------
CHNSE  Chinese
ITALN  Italian
MXICN  Mexican
BENV
источник

Ответы:

22

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

Что еще более важно, это зависит от использования, к которому вы положите первичный ключ. Целочисленные сериалы имеют то преимущество, что они просты в использовании и реализации. Они также, в зависимости от конкретной реализации метода сериализации, имеют то преимущество, что их можно быстро получить , поскольку большинство баз данных просто хранят серийный номер в фиксированном месте, а не извлекают его Select max(ID)+1 from fooна лету.

Возникает вопрос: как 5-символьный ключ представляет «значимую ценность» для вас и для приложения? Как создается это значение и занимает ли оно больше или меньше времени, чем поиск инкрементного серийного номера. Хотя в некоторых целых числах сэкономлено тривиальное количество места, подавляющее большинство систем будет игнорировать эту экономию пространства.

Это не влияет на производительность, за исключением того, что схема персонажей требует, чтобы никогда не было автоматического движка, поскольку ваши «ключи» недостижимы. Для вашего конкретного домена не беспокойтесь о искусственных ключах, а просто используйте китайские, японские и тайские имена ключей. В то время как вы не можете гарантировать уникальность любого возможного приложения, в вашей области гораздо разумнее использовать их вместо ужасных и принудительных сокращений из 5 символов. Существенного влияния на производительность не будет, пока вы не получите миллионы кортежей.

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

Если у меня есть 10 000 рецептов, разница между 5-символьной и 20-символьной клавишей не начинает увеличиваться?

Пространство дешево . Когда вы говорите 10 000 000 рецептов, над которыми вы выполняете операции OLAP, тогда, возможно. С 10 тысячами рецептов вы получаете 150 тысяч места.

Но опять же, это зависит. Если у вас много миллионов записей и вы выполняете соединения с ними, то имеет смысл денормализовать поиск чего-то такого тривиального (в материализованное представление). Для всех практических целей относительная эффективность соединения на современном компьютере между 5-символьным ключом и ключом переменной длины настолько похожа, что она идентична. К счастью, мы живем в мире обильных процессоров и обильных дисков. Противные - это слишком много объединений и неэффективность запросов, а не посимвольное сравнение. При этом всегда проверяйте .

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

Брайан Баллсун-Стэнтон
источник
@ BrianBallsun-Stanton Если у вас есть какие-либо громоздкие последовательные данные, относящиеся к этим таблицам поиска, пространство для хранения не дешево (с точки зрения скорости запросов), поскольку скорость чтения с диска является узким местом в любой RDB, которая не может быть полностью кэширована в ОЗУ. Я обнаружил это, пытаясь разработать схему RDB, которая могла бы конкурировать с лучшими в бизнесе БД временных рядов. Полное раскрытие информации, я не имею никакого отношения к Skyspark, за исключением того, что они платят моему работодателю много за использование их очень эффективной БД.
вар
8

Я думаю, нет проблем с производительностью для редко изменяемой таблицы. Возможно, у вас будут проблемы с дизайном в будущем. Я предлагаю вам не использовать бизнес-данные в качестве первичного ключа из-за изменений в бизнесе. Используйте любой дополнительный первичный ключ для «связывания» таблиц в вашей модели. Любые изменения в бизнесе НЕ повлияют на связанные с этим таблицы.

Гарик
источник
3

Реальный вопрос заключается в том, является ли производительность запросов к БД вообще значимой для вашего приложения (размер данных). Если ваш запрос занимает микросекунды, сохранение нескольких из этих микросекунд с помощью Intключей не стоит потери читаемости / удобства обслуживания. Однако, если ваш запрос занимает минуты, то сохранение некоторых из этих минут может стоить боли Intключей.

Вот почему я думаю, что целые числа могут сэкономить ваше время запроса (в процентах от общего времени запроса), но основатели SkySpark могут объяснить это лучше меня . Полное раскрытие, мой работодатель платит SkySpark много денег, чтобы использовать их БД, и я пытаюсь создать что-то лучше / быстрее.

Если у вас есть много последовательных данных (файлы журналов, временные ряды, аналитика, текстовые или речевые корпуса), которые имеют связи (отношения) с любой из ваших таблиц поиска, вы обнаружите, что пространство хранения имеет решающее значение для скорости запросов, несмотря на @ Правильный анализ Ballsun-Stanton того, насколько дешевое место в $. Поскольку большая часть времени запроса (для последовательных данных) тратится на чтение диска, пространство не является дешевым с точки зрения времени (в процентах от общего времени запроса). Таким образом, если ваша RDB автоматически и эффективно не сжимает / распаковывает все внешние ключи (ключи к связанным записям), вы захотите, чтобы все ваши ключи были такими Int, которые являются наиболее эффективными с точки зрения дискового пространства (и скорости чтения) на единицу информации содержание (энтропия). К вашему сведению MyISAM в MySql накладывает ограниченияо том, что вы можете делать со сжатыми строками данных (только для чтения). Другими словами, автоматически увеличиваемые целые числа уже сжаты настолько, насколько это теоретически возможно , учитывая низкое ограничение минимального размера в большинстве целочисленных полей БД. И это сжатие происходит без:

  1. сжатие времени запроса / декомпрессия
  2. штраф за чтение диска во время запроса
  3. Только для чтения или другие ограничения БД для сжатых записей данных или ключей

Есть причина, по которой популярные эффективные ORM, такие как Django, по умолчанию используют автоинкрементные целые числа для PK, и почему другие вопросы SO пришли к такому же выводу.

варочные панели
источник