2009-11-06 7 views
16

Tworzę indeksy bez klauzuli "USING BTREE". Czy jest jakaś korzyść z używania indeksu BTREE?przewaga BTREE?

CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`); 
+1

Strona podręcznika MySQL, którą chcesz, to [tutaj] (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html). – dnagirl

Odpowiedz

12

BTREE jest domyślną metodą indeksu. Możesz go bezpiecznie pominąć.

+9

To naprawdę zależy od silnika pamięci masowej. –

+1

To nieprawda w przypadku wszystkich silników pamięci masowej. –

6

To zależy od używanego mechanizmu magazynowania. Dla większości BTREE jest domyślny, więc podanie go tak naprawdę niczego nie zmienia. W przypadku silników magazynujących, takich jak MEMORY/HEAP i NDB, domyślnie używane są indeksy HASH domyślnie.

Więcej informacji można znaleźć here.

To, czy B-drzewo lub indeks HASH jest korzystne dla ciebie z perspektywy wydajność zależy od danych i jak masz dostępu do niego. Jeśli wiesz, że twoje zapytania będą dotyczyć dokładnie jednego wiersza lub rozrzuconych pojedynczych wierszy, przydatny może być indeks HASH. Niezależnie od tego, generalnie wolę indeks BTREE, ponieważ dane są sortowane, dzięki czemu zapytania o zakres i te, które zwracają wiele wierszy, są bardziej wydajne.

36

Po pierwsze, w zależności od używanego mechanizmu pamięci masowej, możesz po prostu nie mieć wyboru (InnoDB na przykład używa tylko Btree dla swojego indeksu).

Ponadto, BTREE jest domyślnym typem indeksu dla większości silników pamięci masowej.

Teraz ... Istnieją przypadki, w których używanie alternatywnych typów indeksów może poprawić wydajność. Są (stosunkowo rzadkie przypadki), kiedy indeks HASH może pomóc. Należy pamiętać, że po utworzeniu indeksu HASH tworzony jest również indeks BREEF. Częściowo wynika to z faktu, że indeksy hash mogą jedynie rozwiązywać predykaty równości. (warunek taki jak WHERE Price> 12.0 nie mógł być obsłużony przez indeks hash).

W skrócie: Używaj BTREE, bez względu na to, czy jest to domniemanie (jeśli BTREE jest domyślnym dla używanego Storage), czy jawnie. Dowiedz się o innych typach indeksów, abyś wiedział o nich, gdyby zaszła taka potrzeba.

Edycja: (w poszukiwaniu przypadki, można użyć innych rodzajów Index)
skutecznie w przypadku jest raczej prosty do RTREE indeksów. Są one obsługiwane tylko z MySQL w kontekście "SPATIAL" databases, tj. Bazy danych, które zawierają kontekst położenia geograficznego, taki jak Point i inny obiekt w modelu GIS).

Indeksy HASH są bardziej ogólne (nie ograniczają się do konkretnego zastosowania lub typu danych) i ogólnie można śledzić intuicyjne rozumienie skrótów, aby uzyskać wskazówkę, kiedy mogą one być lepsze od starego, ale wiernego BŁĘDU. Jak wskazano wcześniej, oznaczałoby to, że kolumny są zwykle wyszukiwane z równym predykatem. Zgaduję, że stosunkowo krótkie tabele przeglądowe i podobne mogą przynieść korzyści, w zależności od skutecznej implementacji w MySQL.

+1

W jaki sposób możemy zmusić MySQL do tworzenia tylko indeksu hash, a nie indeksu btree, jeśli nie potrzebujemy sortowania? (na przykład klucz podstawowy, który nie musi być sortowany) – Pacerier

2

przeszukiwanie zrównoważonego drzewa oznacza, że ​​wszystkie liście mają tę samą głębokość. Na górze nie ma wskaźnika drogi startowej. Rzeczywiście, nawet większe B-drzewa mogą zagwarantować pobranie niewielkiej liczby węzłów w celu znalezienia danego klucza. Na przykład drzewo B z 10 000 000 kluczy z 50 kluczami na węzeł nigdy nie musi pobierać więcej niż 4 węzły, aby znaleźć dowolny klucz. Drzewo B jest specjalnym formatem struktury danych dla indeksu, który umożliwia szybki dostęp do danych w indeksie. Jedną z właściwości tej struktury danych jest to, że indeks jest zawsze saldem. Oznacza to, że każdy węzeł na najniższym poziomie jest równoodległy od najwyższego węzła lub węzła głównego drzewa. Każda strona indeksu ma tę samą liczbę węzłów. Węzły na najniższych poziomach są znane jako węzły liści. Wszystkie inne węzły są znane jako węzły rozgałęzień. Punkty graniczne do innych gałęzi lub węzłów liści.Węzły liści przechowują wartości indeksowanych kolumn i rowidów wskazujących na odrębny wiersz, który ma te wartości. Rzeczywisty rozkład będzie zależał od liczby wartości danych w każdym zakresie wartości w drzewie B, a ogólny cel ma na celu zmniejszenie liczby wymaganych poziomów, które muszą zostać przetransmitowane, aby uzyskać określoną wartość. Zaletą struktury drzewa B jest:

  1. Wszystkie bloki liści mają tę samą głębokość (liczbę wartości).
  2. Wysokość drzewa B jest zwykle dość mała.W niektórych przypadkach węzeł główny jest jedynym węzłem liści, a wysokość wynosi 1. Ponieważ tabele zawierają więcej wstawianych wierszy, indeks musi rosnąć, aby uwzględnić to Jednak nawet w tabelach z ponad 1 milionem rzędów, ideogram drzewa B zwykle ma wysokość 3. W największym z tabel, wysokość może wynosić tylko 4. Oznacza to, że nawet dla największych tabel, zajmuje to tylko 4 bloki znaleźć rowid z rzędu, którego szukasz, Jest to niezwykle wydajne.
  3. W przypadku losowo wprowadzanych danych, drzewo B pozostawia bilanse automatycznie. W rzeczywistości B-drzewo pozostaje na wagach bez względu na to, jakie dane są do niego wprowadzane.
  4. Wszystkie bloki indeksu B-drzewa są trzy czwarte pełne (średnio), co pozwala na wstawianie bez ponownego buforowania. 5.B-drzewo zapewnia doskonałą wydajność dla wszystkich typów selekcji. 6. Wstawianie, aktualizowanie i usuwanie jest zazwyczaj wydajne w strukturze drzewa B-tree. 7.B-drzewo wydajność pozostaje optymalna, nawet przy tabelach od małych do dużych.
0

Uproszczona odpowiedź brzmi, jeśli twój SQL używa instrukcji LIKE na tym polu, to używanie indeksu BTREE powinno przewyższać indeks Hash. Jeśli używasz równań (=) dla tego pola, pozostań przy Indeksie haszysz.

Powiązane problemy