2010-04-05 3 views
8

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

Предположим, у меня есть таблица продуктов, и каждый продукт имеет глобально уникальный номер SKU - это будет строка из 8 символов. Почему бы не сделать это ПК? Как правило, я бы сделал это поле уникальным индексом, но затем автоматически увеличил число int в качестве PK, так как я предполагал, что это будет быстрее, проще в обслуживании и позволит мне делать такие вещи, как легко получить последние 5 записей.

Но с точки зрения оптимизации, предполагая, что я только когда-либо буду соответствовать полному текстовому полю, а затем выполняя соответствующие текстовые запросы (например, как %%), вы можете подумать о каких-либо причинах не использовать текстовый первичный ключ, скорее всего типа varchar()?

Приветствия, imanc

+0

возможно дубликат http://stackoverflow.com/questions/63090/surrogate-vs-natural-business-keys – outis

ответ

6

Использование номера SKU в качестве первичного ключа имеет некоторый смысл. Вы хотите проиндексировать его, чтобы быстро выполнять поиск по SKU. И SKU - это natural index.

Однако есть некоторые штрафы:

  • Производительность (как сказал Coronatus)

  • Недостаток гибкости конструкции. Если по какой-либо причине SKU перестанет быть глобально уникальным, вы будете вынуждены изменить не только структуру таблицы, но и все ваши запросы.

  • Изменение SKU одного элемента заставит вас изменить все отношения в базе данных.

-2

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

Кроме того, индексы MySQL в строках содержат только первые четыре буквы по умолчанию.

Если у вас есть строки blabfoo, blabbar, blabboo, индекс будет абсолютно бесполезным, потому что первые 4 символа равны, поэтому поиск «blabf» будет начинаться со всеми 3 строками, а затем перебирать результаты.

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

+5

Это просто неверно. По умолчанию MySQL будет индексировать всю строку (если это не текст/blob, и в этом случае вы должны указать длину), а получение строк по индексированному столбцу строки очень быстро. – grahamparks

+0

@grahamparks Отличный комментарий, но насколько быстро он сравнивается с целыми индексами? – 2013-06-17 16:13:19