B-Tree против хеш-таблицы - PullRequest
       53

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

85 голосов
/ 05 сентября 2011

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

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

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

Ответы [ 4 ]

89 голосов
/ 05 сентября 2011

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

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

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

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

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

Это называется RUSH - R eplication U nder S calable H ashing, и эти алгоритмы так называемые алгоритмы RUSH.

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

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

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

58 голосов
/ 20 мая 2016

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

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

13 голосов
/ 05 сентября 2011

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

5 голосов
/ 05 сентября 2011

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

...