B-дерево против хэш-таблицы



в MySQL тип индекса является b-деревом, а доступ к элементу в b-дереве находится в логарифмическом амортизированном времени O(log(n)).



С другой стороны, доступ к элементу хэш-таблицы в O(1).



почему хэш-таблица не используется вместо b-дерева для доступа к данным внутри базы данных?

730   4  

4 ответов:

вы можете получить доступ только к элементам по их первичному ключу в хэш-таблице. Это быстрее, чем с древовидным алгоритмом (O(1) вместо log(n)), но вы не можете выбрать диапазоны (все что между x и y). Древовидные алгоритмы поддерживают это в Log(n) в то время как хэш-индексы могут привести к полному сканированию таблицы O(n). Также постоянные накладные расходы хэш-индексов обычно больше (который не является фактором в тета-нотации, но он все еще существует). Также древовидные алгоритмы обычно легче поддерживать, расти с данными, масштабировать и т. д.

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

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

сегодняшние алгоритмы хэш-таблиц обычно масштабирование, но масштабирование может быть неэффективным.

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

его называют RUSH -Replication U nder Scalable Hашинг, и эти алгоритмы, таким образом, называются RUSH алгоритмы.

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

компромисс для алгоритмов дерева мал, и они подходят почти для каждого случая использования и, следовательно, по умолчанию.

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

на самом деле, похоже, что MySQL использует оба вида индексов либо хэш-таблицу, либо b-дерево в соответствии со следующим ссылке.

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

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

Я думаю, что хэш-карты также не масштабируются и могут быть дорогими, когда вся карта нуждается в повторном хэшировании.

Comments

    Ничего не найдено.