2010-02-12 4 views
13

Каково было бы ограничение производительности при использовании строк в качестве первичных ключей вместо bigint и т. Д.? Сравнение строк намного дороже, чем целочисленное сравнение, но, с другой стороны, я могу себе представить, что внутренне СУБД будет вычислять хеш-ключи, чтобы уменьшить штраф.Предел производительности строк в качестве первичных ключей?

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

+0

Duplicate? http://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database –

ответ

4

с другой стороны, я могу себе представить, что внутри СУБД будет вычислять окрошка ключи, чтобы уменьшить неустойку.

БД необходимо поддерживать B-Tree (или аналогичную структуру) с помощью ключа таким образом, чтобы они заказали.

Если ключ хэширован и сохранен в B-дереве, было бы неплохо быстро проверить уникальность ключа - ключ все еще можно эффективно искать. Но вы не сможете найти эффективный для диапазон данных (например, с LIKE), потому что B-Tree больше не упорядочен в соответствии со значением String.

Так что я думаю, что большинство DB действительно хранить строку в B-Tree, который может (1) принять более пространство чем числовые значения и (2) требовать от B-Tree, чтобы быть повторно сбалансирован если ключи вставляются в произвольном порядке (нет понятия возрастающего значения как с числовым pk).

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

1

Это зависит от нескольких факторов: РСУБД, количество индексов, включающих те столбцы, но в целом это будет более эффективным использованием Интс, folowed по bigints.

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

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

3

В нашем продукте мы используем VARCHAR (32) для первичных ключей (GUID), и мы не встречались проблемы с производительностью этого. Наш продукт представляет собой веб-сайт с экстремальной перегрузкой и имеет решающее значение для стабильности. Мы используем SQL Server 2005.

Редактировать: В наших самых больших таблицах мы имеем более 3 000 000 записей с большим количеством вставок и выбираем из них. Я думаю, что в общем случае преимущество перехода на ключ int будет очень низким, но проблемы при миграции очень высоки.

+1

В SQL Server существует тип GUID. Кроме того, он идеально подходит для репликации. – Timmy

1

Одна вещь, чтобы следить за это страница расщепляется (я знаю, что это может произойти в SQL Server - вероятно, то же самое в MySQL).

Первичные ключи физически упорядочены. Используя целое число с автоматическим добавлением, вы гарантируете, что каждый раз, когда вы вставляете, вы вставляете следующий номер вверх, поэтому нет необходимости переустанавливать ключи для db. Однако, если вы используете строки, вы можете вставить pk в середине других ключей для поддержания порядка pk. Этот процесс переупорядочения pks на вставке может стать дорогостоящим.

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