B-дерево против хэш-таблицы
в MySQL тип индекса является b-деревом, а доступ к элементу в b-дереве находится в логарифмическом амортизированном времени O(log(n)).
С другой стороны, доступ к элементу хэш-таблицы в O(1).
почему хэш-таблица не используется вместо b-дерева для доступа к данным внутри базы данных?
4 ответов:
вы можете получить доступ только к элементам по их первичному ключу в хэш-таблице. Это быстрее, чем с древовидным алгоритмом (
O(1)вместоlog(n)), но вы не можете выбрать диапазоны (все что междуxиy). Древовидные алгоритмы поддерживают это вLog(n)в то время как хэш-индексы могут привести к полному сканированию таблицыO(n). Также постоянные накладные расходы хэш-индексов обычно больше (который не является фактором в тета-нотации, но он все еще существует). Также древовидные алгоритмы обычно легче поддерживать, расти с данными, масштабировать и т. д.хэш-индексы работают с заранее определенными размерами хэша, поэтому вы получаете некоторые "ведра", в которых хранятся объекты. Эти объекты зацикливаются снова, чтобы действительно найти правильный внутри этого раздела.
поэтому, если у вас есть небольшие размеры, у вас есть много накладных расходов для небольших элементов, большие размеры приводят к дальнейшему сканированию.
сегодняшние алгоритмы хэш-таблиц обычно масштабирование, но масштабирование может быть неэффективным.
действительно существуют масштабируемые алгоритмы хэширования. Не спрашивайте меня, как это работает-это тоже тайна для меня. Насколько мне известно, они эволюционировали из масштабируемые репликации, где перемалывания-это не просто.
его называют RUSH -Replication U nder Scalable Hашинг, и эти алгоритмы, таким образом, называются RUSH алгоритмы.
однако может быть точка, где ваш индекс превышает допустимый размер по сравнению с вашими размерами хэша, и весь ваш индекс должен быть перестроен. Обычно это не проблема, но для огромных-огромных-огромных баз данных это может занять несколько дней.
компромисс для алгоритмов дерева мал, и они подходят почти для каждого случая использования и, следовательно, по умолчанию.
однако, если у вас есть очень точный случай использования, и вы точно знаете, что и только что будет необходимо, вы можете воспользоваться хэширование индексы.
на самом деле, похоже, что MySQL использует оба вида индексов либо хэш-таблицу, либо b-дерево в соответствии со следующим ссылке.
разница между использованием b-дерева и хэш-таблицы заключается в том, что первый позволяет использовать сравнение столбца в выражениях, которые используют =, >, >=, только для сравнения на равенство которые используют операторы = или .
временная сложность хэш-таблиц постоянна только для достаточно больших хэш-таблиц (должно быть достаточно ведер для хранения данных). Размер таблицы базы данных заранее не известен, поэтому таблицу необходимо время от времени перефразировать, чтобы получить оптимальную производительность из хэш-таблицы. Перефразирование также дорого.
Я думаю, что хэш-карты также не масштабируются и могут быть дорогими, когда вся карта нуждается в повторном хэшировании.
Comments