текстовые индексы vs целочисленные индексы в mysql
Я всегда пытался иметь целочисленный первичный ключ в таблице, несмотря ни на что. Но теперь я сомневаюсь, что это всегда необходимо.
предположим, у меня есть таблица продуктов, и каждый продукт имеет глобально уникальный номер SKU - это будет строка, скажем, 8-16 символов. Почему бы не сделать это ПК? Обычно я бы сделал это поле уникальным индексом, но затем имел бы автоматическое приращение поля int в качестве PK, поскольку я предполагал, что это будет быстрее, проще в обслуживании и позволит мне чтобы делать вещи, как получить последние 5 записей с легкостью.
но с точки зрения оптимизации, предполагая, что я буду только соответствовать полному текстовому полю, а затем выполнять текстовые запросы (например,%%), можете ли вы, ребята, придумать какие-либо причины не использовать текстовый первичный ключ, скорее всего, типа varchar()?
Ура, imanc
2 ответов
использование номера SKU в качестве первичного ключа имеет некоторый смысл. Вам понравится индексировать его, чтобы быстро выполнять поиск по SKU. А СКУ-это природные индекс.
однако он имеет некоторые штрафные санкции:
производительность (как обыкновенного сказал)
отсутствие гибкости конструкции. Если по какой-либо причине SKU перестанет быть глобально уникальным, вы будете вынуждены изменить не только структуру таблицы, но и все ваши запросы.
изменение SKU одного элемента заставит вас изменить все отношения в базе данных.
компьютеры намного быстрее сравнивают числа, чем строки.
кроме того, индексы MySQL строк по умолчанию содержат только первые 4 буквы.
Если у вас есть строки blabfoo, blabbar, blabboo
, индекс будет совершенно бесполезен, потому что первые 4 символа равны, поэтому поиск "blabf" будет initally соответствовать всем 3 строкам, а затем повторять результаты.
в принципе, никогда не используйте строки для индексов, потому что они медленные и используют больше места.