MySQL - использование String в качестве первичного ключа - PullRequest
31 голосов
/ 11 августа 2010

Я уже видел похожую запись о переполнении стека, но не совсем доволен.

Допустим, я предлагаю веб-сервис.http://foo.com/SERVICEID

SERVICEID - это уникальный идентификатор строки, используемый для ссылки на службу (основание 64, строчные / прописные + цифры), аналогично тому, как службы сокращения URL генерируют идентификаторы для URL.

Iпонимать, что при сравнении строк и целых чисел существуют проблемы с производительностью.

Но мне любопытно, как максимально оптимизировать первичный ключ типа String.

Я использую MySQL (в настоящее время использую движок MyISAM, хотя я, правда, не понимаю всех различий в движке).).

Спасибо.

обновить для моей цели строка на самом деле была просто целым числом, закодированным в base62, поэтому первичный ключ был целым числом, и, поскольку вы вряд ли когда-либо превысите размер bigint, он просто не 'Слишком много смысла использовать что-либо еще (для моего конкретного случая использования)

1 Ответ

42 голосов
/ 11 августа 2010

Нет ничего плохого в использовании CHAR или VARCHAR в качестве первичного ключа.

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

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

...