Jak działają indeksy złożone?

Stworzyłem indeksy złożone (indeksy dla was matematyków) na tabelach wcześniej z założeniem, jak one działają. Byłem tylko ciekaw, czy moje założenie jest poprawne, czy nie.

Zakładam, że gdy wymieniasz kolejność kolumn dla indeksu, określasz również sposób grupowania indeksów. Na przykład, jeśli masz kolumny a, b, i c, i podajesz indeks w tej samej kolejności a ASC, b ASC, i c ASC wtedy indeks wynikowy będzie w zasadzie wiele indeksów dla każdej "grupy" w a.

Czy to prawda? Jeśli nie, to jak rzeczywiście będzie wyglądał indeks wynikowy?
Author: Joe Phillips, 2009-04-27

4 answers

Indeksy złożone działają tak samo jak zwykłe indeksy, z tym że mają klucze wielowartościowe.

Jeśli zdefiniujesz indeks na polach (a, b, c), rekordy są sortowane najpierw na a, następnie b, a następnie c.

Przykład:

| A | B | C |
-------------
| 1 | 2 | 3 |
| 1 | 4 | 2 |
| 1 | 4 | 4 |
| 2 | 3 | 5 |
| 2 | 4 | 4 |
| 2 | 4 | 5 |
 85
Author: Rik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-27 20:50:38

Indeks złożony jest jak zwykły indeks alfabetu w słowniku, ale obejmuje dwie lub więcej liter, jak to:

AA - page 1
AB - page 12

Itd.

Wiersze tabeli są uporządkowane najpierw przez pierwszą kolumnę indeksu, potem przez drugą itd.

Jest użyteczny, gdy wyszukujesz po obu kolumnach lub po pierwszej kolumnie. Jeśli twój indeks jest taki:

AA - page 1
AB - page 12
…
AZ - page 245
BA - page 246
…

Można go użyć do wyszukiwania na 2 litery (= 2 kolumny w tabeli), lub jak zwykły indeks na jednym litera:

A - page 1
B - page 246
…

Zauważ, że w przypadku słownika strony same w sobie są uporządkowane alfabetycznie. To przykład indeksu CLUSTERED.

W prostym, Nie-CLUSTERED indeksie, odniesienia do stron są uporządkowane, jak w książce historycznej:

Gaul, Alesia: pages 12, 56, 78
Gaul, Augustodonum Aeduorum: page 145
…
Gaul, Vellaunodunum: page 24
Egypt, Alexandria: pages 56, 194, 213, 234, 267

Indeksy złożone mogą być również używane, gdy ORDER BY dwie lub więcej kolumn. W tym przypadku może się przydać klauzula DESC.

Zobacz ten artykuł na moim blogu o używaniu klauzuli DESC w złożonym indeks:

 36
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-27 20:53:37

Najczęstsza implementacja indeksów wykorzystuje drzewa B, aby umożliwić nieco szybkie wyszukiwanie, a także stosunkowo szybkie skanowanie zasięgu. To zbyt wiele do wyjaśnienia, ale tutaj jest artykuł Wikipedii na B-trees. I masz rację, Pierwsza kolumna zadeklarowana w indeksie create będzie kolumną wysokiego rzędu w wynikowym drzewie B.

Wyszukiwanie w kolumnie wysokiego rzędu oznacza skanowanie zakresu, A Indeks drzewa B może być bardzo przydatny do takiego wyszukiwania. Najprostszy sposób na zobaczenie jest to analogiczne do starych katalogów kart, które masz w bibliotekach, które nie zostały jeszcze przekonwertowane do katalogów on-line.

Jeśli szukasz wszystkich kart dla autorów, których nazwisko brzmi "Clemens", po prostu przejdź do katalogu autora i bardzo szybko znajdź szufladę z napisem "CLE-CLI" z przodu. To odpowiednia szuflada. Teraz wykonaj rodzaj Nieformalnego wyszukiwania binarnego w tej szufladzie, aby szybko znaleźć wszystkie karty, które mówią "Clemens, Roger" lub "Clemens, Samuel" na oni.

Ale załóżmy, że chcesz znaleźć wszystkie karty dla autorów, których imię to "Samuel". Teraz jesteś nad potokiem, ponieważ te karty nie są zebrane w jednym miejscu w katalogu autora. Podobne zjawisko występuje w przypadku Indeksów złożonych w bazie danych.

Różne Dbmsy różnią się tym, jak sprytny jest ich optymalizator w wykrywaniu skanowania zakresu indeksów i dokładnym szacowaniu ich kosztów. I nie wszystkie indeksy są drzewami B. Będziesz musiał przeczytać dokumenty dla swojego konkretne DBMS, aby uzyskać prawdziwe informacje.

 19
Author: Walter Mitty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-27 20:11:54

Nie. Wynikowy indeks będzie pojedynczym indeksem, ale z kluczem złożonym.

KeyX = A, B, C, D; KeyY = 1,2,3,4;

Indeks KeyX,KeyY będzie w rzeczywistości: A1,A2,A3,B1,B3,C3,C4, D2

Tak, że w przypadku, gdy trzeba znaleźć coś przez KeyX i KeyY-to będzie szybkie i będzie używać pojedynczego indeksu. Coś jak SELECT ... Gdzie KeyX = " B " i KeyY = 3.

Ale ważne jest, aby zrozumieć: gdzie KeyX = ? requests will use that index, where WHERE KeyY = ? Wola nie używać takiego indeksu w ogóle.

 4
Author: Mash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-27 20:18:22