B-Tree vs Hash Table

103

W MySQL typ indeksu to b-drzewo, a dostęp do elementu w b-drzewie odbywa się w logarytmicznym amortyzowanym czasie O(log(n)).

Z drugiej strony dostęp do elementu w tablicy skrótów znajduje się w O(1).

Dlaczego zamiast b-drzewa nie używa się tablicy skrótów w celu uzyskania dostępu do danych w bazie danych?

JohnJohnGa
źródło
9
Tabele skrótu nie obsługują zapytań o zakres i nie mogą się płynnie zwiększać ani zmniejszać podczas działania.
hmakholm opuścił Monikę
3
@HenningMakholm Dlaczego nie haszować kolumn, które nie wymagają zapytań o zakres?
Pacerier,

Odpowiedzi:

116

Możesz uzyskać dostęp do elementów tylko za pomocą ich klucza głównego w tablicy hashy. Jest to szybsze niż w przypadku algorytmu drzewiastego ( O(1)zamiastlog(n) ), ale nie można wybierać zakresów ( wszystko pomiędzy xiy ). Obsługują to algorytmy drzewiaste, Log(n)podczas gdy indeksy skrótów mogą skutkować pełnym skanowaniem tabeli O(n). Również stały narzut indeksów hash jest zwykle większy ( co nie jest czynnikiem w notacji theta, ale nadal istnieje ). Również algorytmy drzewiaste są zwykle łatwiejsze w utrzymaniu, rosną wraz z danymi, skalą itp.

Indeksy haszujące działają z predefiniowanymi rozmiarami skrótów, więc otrzymujesz kilka „zasobników”, w których przechowywane są obiekty. Te obiekty są ponownie zapętlane, aby naprawdę znaleźć właściwy w tej partycji.

Więc jeśli masz małe rozmiary, masz dużo narzutu na małe elementy, duże rozmiary powodują dalsze skanowanie.

Dzisiejsze algorytmy tablic skrótów zwykle skalują się, ale skalowanie może być nieefektywne.

Rzeczywiście istnieją skalowalne algorytmy haszujące. Nie pytaj mnie, jak to działa - dla mnie też to tajemnica. AFAIK, ewoluowali ze skalowalnej replikacji, w której ponowne haszowanie nie jest łatwe.

Nazywa POŚPIECH - R eplication U RSR S calable H spopielania, a te tak zwane są algorytmy algorytmy szczytu.

Może się jednak zdarzyć, że indeks przekroczy dopuszczalny rozmiar w porównaniu z rozmiarami skrótów i cały indeks będzie wymagał ponownego zbudowania. Zwykle nie stanowi to problemu, ale w przypadku ogromnych, ogromnych, ogromnych baz danych może to zająć kilka dni.

Kompromis dla algorytmów drzewiastych jest niewielki i są one odpowiednie dla prawie każdego przypadku użycia, a zatem są domyślne.

Jeśli jednak masz bardzo precyzyjny przypadek użycia i wiesz dokładnie, co i tylko co będzie potrzebne, możesz skorzystać z indeksów haszujących.

Surrican
źródło
Czy możesz wyjaśnić więcej na temat przebudowy indeksu? Czy to oznacza, że ​​przez x dni podczas odbudowywania indeksu tabela jest całkowicie niedostępna do użytku w tym okresie?
Pacerier,
zależy to od używanego systemu bazy danych. pytanie dotyczyło tylko aspektów teoretycznych. nie znam szczegółów implementacji typowych systemów baz danych. ale zwykle nie powinno tak być, ponieważ drugi indeks można zbudować, gdy pierwszy jest nadal używany
The Surrican,
„Dostęp do elementów można uzyskać tylko za pomocą klucza podstawowego” - masz na myśli wartość kolumny, która ma prawo indeksu, niezależnie od tego, czy jest to klucz podstawowy, czy inny typ indeksu?
Mark Fisher,
90

Właściwie wygląda na to, że MySQL używa obu rodzajów indeksów albo tabeli skrótów, albo b-drzewa, zgodnie z poniższym linkiem .

Różnica między używaniem b-drzewa a tablicą skrótów polega na tym, że pierwsza z nich umożliwia porównywanie kolumn w wyrażeniach, które używają operatorów =,>,> =, <, <= lub BETWEEN, podczas gdy druga jest używana tylko do porównania równości, które używają operatorów = lub <=>.

lmiguelvargasf
źródło
9
To nie w porządku. Najlepsza odpowiedź ma najniższy wynik.
Андрей Беньковский
6
To jest dokładnie to, czego szukałem. Zależało mi na tym, jak to wpływa na moje zapytania, a nie na analizie technicznej.
Ben Dehghan,
Tak! Ta odpowiedź najbardziej mi pomogła.
Ron Ross,
wielkie dzięki, minęło dużo czasu, ale ta odpowiedź również bardzo mi pomogła.
Reham Fahmy
14

Złożoność czasowa tabel skrótów jest stała tylko w przypadku tabel o wystarczającej wielkości (musi być wystarczająco dużo zasobników do przechowywania danych). Rozmiar tabeli bazy danych nie jest znany z góry, dlatego tabela musi być od czasu do czasu ponownie haszowana, aby uzyskać optymalną wydajność z tablicy haszującej. Ponowne haszowanie jest również drogie.

Emil Vikström
źródło
2
Czy ponowne haszowanie można wykonać, gdy baza danych jest online? A może musimy zablokować stół, aby wszystko powtórzyć?
Pacerier,
1
Pacerier, MySQL nie obsługują indeksów mieszania. Teoretycznie możliwe jest ponowne zhaszowanie indeksu, gdy baza danych jest nadal online (nadal używaj starego indeksu, utwórz nowy indeks, przełącz się na nowy po zakończeniu), ale nie wiem, co zrobiłby MySQL, gdyby zostały zaimplementowane wskazówki dotyczące haszyszu.
Emil Vikström
3
MySQL obsługuje indeksy hash, prawda? : dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
Pacerier,
Wydajesz się mieć rację. To była dla mnie nowość! Muszę starać się nadążyć za rozwojem :-) W takim razie o wiele lepiej odpowiadasz na swoje pytanie niż ja, ale jak powiedziałem: teoretycznie jest to możliwe.
Emil Vikström
Przy okazji, dlaczego mówisz, że „btree można łatwo przenieść na dysk, ale hashtable nie”? Czy nie można przechowywać tablicy hashy na dysku, ponieważ wystarczyłoby proste wyszukiwanie klucza?
Pacerier
6

Myślę, że Hashmapy nie skalują się również i mogą być drogie, gdy cała mapa wymaga ponownego skompresowania.

Jonathan Weatherhead
źródło
0

Pick DB / OS był oparty na haszowaniu i działał dobrze. Przy większej ilości pamięci w dzisiejszych czasach do obsługi wydajnych rzadkich tablic mieszających i nadmiarowego mieszania do obsługi zapytań o skromny zakres, powiedziałbym, że hashowanie może jeszcze mieć swoje miejsce (niektórzy woleliby mieć inne formy dopasowywania podobieństw niezwiązanych z zakresem, takie jak symbole wieloznaczne i wyrażenia regularne ). Zalecamy również kopiowanie, aby zachować ciągłość łańcuchów kolizji, gdy hierarchie pamięci mają duże różnice szybkości.

RONALD LOUI
źródło