2010-08-11 3 views
28

Я уже видел подобный пост в Stack Overflow, но был не совсем удовлетворен.MySQL - используя String в качестве основного ключа

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

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

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

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

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

Спасибо.

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

ответ

38

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

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

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

+0

Спасибо, я был уверен, что я не был бы большой разницей, но хотел услышать от сообщества, которое «там было сделано» –

+5

Примечание: для столбцов, которые являются только кодом, ограниченным ASCII, а не действительными словами (например, хеши, base64, стандартные коды стран и т. д.), может быть хорошей идеей использовать сортировку 'ascii_bin'. Если вы используете сортировку на основе utf-8, она зарезервирует 3 или 4 байта на символ для столбцов CHAR вместо 1. – thomasrutter

+0

Не используйте коды стран в своих первичных ключах. – displayname

Смежные вопросы