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


103

У MySQL тип індексу - це b-дерево, а доступ до елемента в b-дереві відбувається за логарифмічним амортизованим часом O(log(n)).

З іншого боку, доступ до елемента в хеш-таблиці є в O(1).

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


9
Хеш-таблиці не підтримують запити про діапазон і не можуть плавно зростати або зменшуватися під час роботи.
— hmakholm залишив Моніку

3
@HenningMakholm Чому б не хеш для стовпців, які не потребують запитів діапазону?
— Pacerier

Відповіді:


115

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

Індекси хеш-функцій працюють із заздалегідь визначеними розмірами хешу, тому у вас з’являються деякі «відра», де зберігаються об’єкти. Ці об’єкти знову циклічно переглядаються, щоб дійсно знайти потрібний усередині цього розділу.

Отже, якщо у вас невеликі розміри, у вас є багато накладних витрат на дрібні елементи, великі розміри призводять до подальшого сканування.

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

Дійсно існують масштабовані алгоритми хешування. Не питайте мене, як це працює - для мене це теж загадка. AFAIK вони розвинулися із масштабованої реплікації, де повторне хешування непросте.

Його називають РАШ - R eplication U NDER S calable Н озоления, і ці алгоритми, таким чином , називають алгоритми Раша.

Однак може існувати момент, коли ваш індекс перевищує допустимий розмір порівняно з вашими розмірами хешу, і весь ваш індекс потрібно переробити. Зазвичай це не проблема, але для величезних-величезних-величезних баз даних це може зайняти дні.

Компроміс для алгоритмів дерева невеликий, і вони підходять майже для кожного випадку використання, тому є типовими.

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


Чи можете ви пояснити більше про відновлення індексу? Чи означає це, що протягом x днів, поки індекс відновлюється, таблиця повністю недоступна для використання протягом цього періоду?
— Pacerier

що залежить від використовуваної системи баз даних. питання охоплювало лише теоретичні аспекти. я насправді не знаю деталей реалізації загальних систем баз даних. але зазвичай цього не повинно бути, оскільки другий індекс можна побудувати, поки використовується перший
— The Surrican

"Ви можете отримати доступ до елементів лише за їх первинним ключем" - ви маєте на увазі під значенням стовпця, що має право індексу, незалежно від того, це первинний ключ чи інший тип індексу?
— Марк Фішер

90

Насправді, здається, що MySQL використовує обидва типи індексів - або хеш-таблицю, або b-дерево згідно з наступним посиланням .

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


9
Це несправедливо. Найкраща відповідь має найнижчий бал.
— Андрей Беньковский

6
Це саме те, що я шукав. Мені було цікаво, як це впливає на мої запити, а не технічний аналіз.
— Ben Dehghan

Так! Ця відповідь мені найбільше допомогла.
— Рон Росс

велике спасибі, давно, але ця відповідь також мені дуже допомогла.
— Reham Fahmy

14

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


2
Чи можна виконати повторне повторне розміщення, коли db перебуває в мережі? Або нам доводиться замикати стіл, щоб все переробити?
— Pacerier

1
Pacerier, MySQL не підтримують хеш-індекси. Теоретично можливо переробити індекс, поки база даних все ще перебуває в мережі (продовжуйте використовувати старий індекс, створюйте новий індекс, перемикайтеся на новий, коли це буде зроблено), але я не знаю, що MySQL зробить, якщо вони будуть реалізовані хеш-індекси.
— Emil Vikström

3
MySQL підтримує хеш-індекси, чи не так? : dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
— Pacerier

Здається, ви праві. Це була новина для мене! Я повинен намагатись не відставати від розвитку :-) Тоді вам набагато краще відповісти на ваше запитання, ніж я, але, як я вже сказав: це теоретично можливо.
— Emil Vikström

До речі, чому ви говорите, що "btree можна легко перекласти на диск, а хеш-таблицю не можна"? Чи не можна хеш-таблицю зберігати на диску, оскільки достатньо простого пошуку ключів?
— Pacerier

6

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


0

Pick DB / OS базувався на хешуванні та працював добре. Наразі більше пам’яті для підтримки ефективних розріджених хеш-таблиць та надлишкового хешування для підтримки запитів щодо помірного діапазону, я б сказав, що хешування все-таки може мати своє місце (деякі воліють мати інші форми відповідності схожості, не пов’язані з діапазоном, такі як підстановні символи та регулярні вирази ). Ми також рекомендуємо копіювати, щоб ланцюги зіткнень залишалися суміжними, коли ієрархії пам’яті мають великі різниці швидкості.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.