|
|
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
softwarer пишет: > Суррогатного первичного ключа - во-первых. Любого. Все, счастливо. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 09:38 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
MasterZivЛюбого. Каскадное обновление (конструкцией ON UPDATE CASCADE или триггером) еще никто не отменял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2008, 10:50 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
автор Суррогатного первичного ключа - во-первых. Необходимость менять значение - таки один из врожденных недостатков естественных ключей Но если по проекту имеется требование чтобы естественный ключ всегда был и был всегда уникальным?... И? получается что на таблице нужно держать два индекса у которых весьма схожее назначение. Как вы думаете, что лучше - один индекс на таблице, который к тому же используется и для поиска, сортировки или 2 индекса, и при этом суррогат особой смысловой нагрузки не несет? А индекс по нему занимает место, и его надо корректировать как и все прочие индексы. Вопрос в том, насколько нормализована будет ваша база. Сколько джойнов будет в ваших запросах. Имейте в виду, что иной раз чтобы вытащить какой-нить атрибут вам придется сделать лишний джойн, что можно было бы избежать при естественных ключах. Вывод - суррогатный ключ нужем там, где первичный ключ получается либо составным и очень длинным, либо его трудно ввести.... А "мастеров" которые на любую таблицу лепят суррогатный ключ - полно. Но не всегда это целесообразно. Однозначного рецепта нет. Типа тут думать надо сначала....)))) Пример из жизни. Было две таблицы - TableA и TableB - на них имелись суррогатные ключи. Между ними должна была быть связь многие ко многим. Понятное дело что нужно всего лишь организовать таблицу с двумя полями TableA_ID, TableB_ID, И комбинация этих полей - уникальна. И на эту таблицу нужно построить 2 индекса по (TableA_ID, TableB_ID) и по (TableB_ID, TableA_ID). Но почему-то один "проектировщик" добавляет еще и третье поле - которое Identity, и тоже уникально для каждой записи. Зачем?... Понятно, что этот индекс и это поле никогда не будут использоваться. Вот и старайтесь, чтобы у вас такого тупизма не было. Каждое поле, каждый индекс должен где-то использоваться. Чем меньше индексов - тем больше перфоменс при добавлениях/удалениях/исправлениях. Анализируйте структуру таблиц. Смотрите какие запросы какие индексы используют. Это долго и трудно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2008, 11:31 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
Я для себя вывел правило, что обязательно нужен суррогатный ключ, если на таблицу будет ссылаться другая таблица. Причем его не обязательно создавать сразу, а можно создать, когда в этом возникнет необходимость. Никто же вас не заставляет (кроме так называемых правил хорошего тона) обязательно иметь в таблице PK. Естесвенный ключ впоследствии может оказаться не уникальным, это встечается сплошь и рядом, и перенаправлять потом ссылки - задача не из легких. В кросс-таблице обычно нет никакой нужды в суррогатном PK, т.к. на нее обычно никто не ссылается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2008, 12:15 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
Владимир П. пишет: > Каскадное обновление (конструкцией ON UPDATE CASCADE или триггером) еще > никто не отменял. Ты пробовал ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 01:47 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
MasterZivТы пробовал ? Да. А что вас смущает? Низкая производительность такого обновления? Так если естественный ключ применять с умом (gardenman в сообщении № 5672455 хорошо описал разумные случаи), то его изменение -- крайне редкая операция. Обычно её необходимость возникает в случае человеческой ошибки ввода, когда данных в подчиненных таблицах еще мало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 14:11 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
Владимир П. пишет: > MasterZiv > Ты пробовал ? > > Да. > А что вас смущает? Меня смущает изменение полей первичного ключа, про которое, если не ошибаюсь, шла речь. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 19:13 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
gardenman[quot автор] Пример из жизни. Было две таблицы - TableA и TableB - на них имелись суррогатные ключи. Между ними должна была быть связь многие ко многим. Понятное дело что нужно всего лишь организовать таблицу с двумя полями TableA_ID, TableB_ID, И комбинация этих полей - уникальна. И на эту таблицу нужно построить 2 индекса по (TableA_ID, TableB_ID) и по (TableB_ID, TableA_ID). Но почему-то один "проектировщик" добавляет еще и третье поле - которое Identity, и тоже уникально для каждой записи. Зачем?... Понятно, что этот индекс и это поле никогда не будут использоваться. Вот и старайтесь, чтобы у вас такого тупизма не было. "Проектировщик" вводит сурогатный ключ в такую таблицу, когда она имеет, например, поле "закрытия" записи (что-то типа date_out). Имея такое поле, строка в таблице уже не будет уникальна по полям TableA и TableB. Она будет уникальна по полям TableA и TableB и date_out. А т.к. date_out для активных записей всегда null, по этим полям нельзя посторить первичный ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 03:26 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
Возвращаясь к теме топика: ссылка http://feedlounge.com/blog/2005/11/20/switched-to-postgresql/ Пример потери производительности MySQL/InnoDB при использовании uuid в качестве основного ключа. (см. комментарии к ссылке. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 23:48 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
Вот тоже неожиданно пришло в голову решение как ускорить сравнение строк. Дано таблица людей "Иванов","Иван","Дмитриевич","01.01.1945" "Наполеон","Адольф","Виссарионович","01.01.1991" Нужно при вводе новой записи наиболее быстро искать ее дубль. Почему бы не добавить в таблицу поле md5? И не вычислять его при вводе в клиентской форме, поиск по числовому ключу наверняка ускорит поиск потенциального дубликата, я прав? И вариант той же задачи, имеются 2 каталога с файлами , названными "Иванов Иван Дмитриевич 01.01.1945", ну вы поняли. Хотелось бы наиболее быстро рассортировать их по 4 каталогам: "Дубли" и соответственно 2 подкаталога в нем и "Уникальные" и в нем 2 подкаталога, содержащие файлы, которые не имеют аналогов в альтернативной папке. Предположим файлов в каждой папке не 4 млрд, а разумное количество, ну например 10000, т.е. получается выгоднее всего из названия файла получить хэш md5, сохранить в коллекцию в памяти а потом сравнивать уже не две коллекции строк ибо это накладная операция, сравнивать каждую строку с каждой, а сравнить коллекции чисел одинаковой разрядности Думаю, с подобными задачами многие сталкиваются, кому достаются унаследованные массивы данных, кто нашел лучшие способы решения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2010, 23:57 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
авторнаверняка ускорит поиск потенциального дубликата, я прав?И да и нет. Поясню, сам по себе поиск ускорится не должен, но размер индекса сократится резко, стало быть читать такой индекс быстрее. Далее - при любом алгоритме хэша неизбежны коллизии, вы предусмотрели реакцию системы на них? Индексы могут потребоваться не только для поиска дублей, но и для поиска записей, так что посмотрите что вы выигрываете итого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2010, 05:12 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
SERG1257Далее - при любом алгоритме хэша неизбежны коллизии, вы предусмотрели реакцию системы на них?Нет, но я предусмотрел вопрос, а посоветуйте алгоритм с наименьшей вероятностью возникновения коллизий на строковых последовательностях. Я думал CRC достаточно в принципе, она же считается быстрее md5, но вроде как вероятность коллизий у CRC существенна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2010, 12:49 |
|
||
|
На сколько числовой id быстрее строкового?
|
|||
|---|---|---|---|
|
#18+
авторпосоветуйте алгоритм с наименьшей вероятностью возникновения коллизий на строковых последовательностях Больше меньше не суть дела. Суть в том, что возможны ложные тревоги, и по хорошему надо бы дополнительно проверить сравнив строки. По алгоритмам не в курсе. Еще один момент. Если ваша субд не умеет вычисляемые поля или функциональные индексы, то вы храните хэш как дополнительное поле, то есть денормализуете, со всеми вытекающими отсюда граблями. Совсем не факт что вы на них наступите, но так сказать плюс один в копилку недостатков. Резюмирую - идея вместо строк сравнивать хэши неплохая сама по себе, но имеет недостатки. В зависимости от профиля загрузки базы может быть выгодной или нет. Возможно применение комбинированных подходов: типа как в вашем примере с поиском людей - построить индекс по фамилии+хэш (индекс вырастет не сильно, но может быть использован и для поиска по фамилии, вероятность коллизий чуть снизится и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2010, 16:07 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35316271&tid=1542612]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 217ms |
| total: | 505ms |

| 0 / 0 |
