background image
background image

Czym jest indeks 

• Indeks – uporządkowana struktura danych 

stosowana w celu przyspieszenia wykonania 
operacji poszukiwania na tabeli 

– Odpowiednik spisu w książce telefonicznej 

• W momencie poszukiwania serwer BD 

najpierw korzysta z indeksów w celu 
zawężenia obszaru poszukiwań 

• Indeks jest strukturą fizycznie istniejącą 

niezależnie od tabeli w bazie danych  

background image

Idea działania indeksów na przykładzie 

wyszukiwania binarnego 

background image

Czy indeksy mają same zalety? 

• Zalety indeksów: 

– Przyspieszenie operacji SELECT 

• Wady indeksów: 

– Zajmują sporo przestrzeni dyskowej 
– Spowalniają operacje modyfikacji oraz wstawiania 

danych do tabel 

• Zawsze jest złoty środek, inny dla każdej 

realnej BD ! 
 

background image

Rodzaje indeksów 

• Indeks gęsty 

– Jest tworzony dla każdego wiersza (każdej wartości 

klucza) tabeli 

• Indeks rzadki 

– Tworzony dla wybranych wartości klucza 

 

background image

Poziomy indeksów 

• Indeks jednopoziomowy 

– Algorytm połowienia binarnego 
– Jest nieefektywny dla dużych zbiorów! 

• Indeks wielopoziomowy 

– Czyli indeks dla indeksu 
– Efektywność b. wysoka 
– Złożona obsługa, wysoki koszt modyfikacji 
– Zajmuje większą przestrzeń dyskową 

background image

Indeks jednopoziomowy 

background image

Indeks wielopoziomowy 

background image

Typy indeksów 

• Indeks podstawowy (główny) 
• Indeks klastrowy (pogrupowany) 
• Indeks wtórny  

background image

Indeks główny 

• Zakłada się na kolumnie klucza głównego 

tabeli 

• Struktura pliku danych – plik uporządkowany 
• Wskaźnik indeksu – na blok danych na dysku  
• Indeks rzadki! 

background image

Indeks główny (c.d.) 

background image

Indeks klastrowy (zgrupowany) 

• Zakładany na kolumnie nie będącej kluczem 

głównym tabeli 

• Ponieważ kolumna może przechowywać 

wartości nieuporządkowane, wskaźnik zawiera 
odniesienie do pierwszego bloku dyskowego 
gdzie znajduje się określona wartość 

• Indeks rzadki! 

background image

Indeks klastrowy (zgrupowany) 

background image

Indeks wtórny (niezgrupowany) 

• Może być założony na kolumnę zawierającą 

wartości unikatowe lub powtarzające się 

• Wskaźnik wskazuje na rekord w bazie danych 

(!) 

• Indeks gesty! 
• Tabela może zawierać dowolną liczbę 

indeksów wtórnych 

background image

Indeks wtórny (niezgrupowany) 

background image

Indeksy wielokolumnowe 

• Indeks można założyć dla dowolnej liczby 

kolumn 

• Zasady: 

– Index(A, B, C) może być wykorzystany  jako 

Index(A) 

– Index(A) + Index(B) <> Index(A,B) 

background image

Struktura indeksu 

• Plik uporządkowany 
• Drzewo niezbalansowane 
• Drzewo zbalansowane (B-Tree) 

background image

Drzewo niezbalansowane 

• Różna długość gałęzi 
• Łatwa modyfikacja  
• Duży rozrzut czasowy przy 

wyszukiwaniu  

background image

Drzewo zbalansowane 

• Jednakowa długość gałęzi 
• Konieczność utrzymania 

drzewa w stanie 
zbalansowania 

• Zapewnia powtarzający się 

czas wyszukiwania 

background image

Struktura drzewa zbalansowanego  

(B-Tree) 

background image

Selektywność indeksu 

• Określa przydatność indeksu (czy warto go w 

ogóle zakładać?) 

• S =       Liczba wartości  unikalnych                  

   

______________________ 

                        Liczba wierszy  
Powinno być: S >= ~80..85% 

background image

Typy danych a indeks 

• Rozmiar indeksu zależy od typu danych w 

kolumnie indeksowanej  

• Nie zaleca się indeksowania typów danych 

złożonych oraz o zmiennej długości (np. 
varchar) 

background image

Indeksy unikalne a powtarzające się 

• Indeks unikalny – każda wartość klucza jest 

unikalna (kolumny klucza głównego lub z 
ograniczeniem UNIQUE) 

• Indeks zwykły – wartości klucza mogą się 

powtarzać (większość indeksów wtórnych) 

background image

Zasady zarządzania indeksami 

background image

1. Optymalizacja składni zapytań 

• To samo zapytania można napisać na kilka 

różnych sposobów 

• Optymalizator SQL prawdopodobnie 

doprowadzi je do wspólnej optymalnej postaci 

• Są sytuacje kiedy optymalizator nie działa 

bądź działa źle! 

background image

1.1. Ograniczenie liczby kolumn 

• Wynik zapytania powinien zawierać wyłącznie 

niezbędne kolumny (!) 

– Jeśli wynik zawiera tylko poindeksowane kolumny, 

szybkość odpowiedzi serwera jak b. wysoka 
ponieważ operuje on wyłącznie na indeksach  

– Zwracanie niepoindeksowanych kolumn może 

prowadzić do konieczności wyszukiwania w samej 
bazie  

background image

1.2. Selektywność warunku WHERE 

• Trzeba dążyć do tego aby każdy warunek 

logiczny stosowany w sekcji WHERE 
maksymalnie zawężał zasięg zwracanych 
danych

– Jeśli zbiór zwracanych danych jest zbyt duży, koszt 

wyszukiwania danych z użyciem indeksów może 
być większy niż liniowe wybieranie danych z 
tabeli! 

background image

2. Efektywne wykorzystanie indeksów 

• Samo założenie indeksów na kolumnach nie 

gwarantuje efektywnego ich wykorzystania! 

• Indeks pomaga w nielicznych sytuacjach kiedy 

warunek logiczny na kolumnie 
poindeksowanej spełnia określone kryteria 

background image

2.1. Stosowanie właściwych warunków 

logicznych w sekcji WHERE 

Należy stosować 

Należy unikać 

=, >, <, <=, >= 
Between 
Like "X%” 

!=, <>,  
IN, OR, NOT  
LIKE "%X” 

background image

2.2. Unikanie stosowania obliczeń na 

kolumnie poindeksowanej 

• Wartości z kolumny poindeksowanej są 

ułożone w określonej kolejności 
przyspieszającej ich wyszukiwanie 

• Operacja arytmetyczna wykonana na tychże 

wartościach nie zawsze daje tę samą 
kolejność
 – indeks nie działa

• Przykład: WHERE Kwota * 2 > 1000 nie 

wykorzystuje indeksu na kolumnie Kwota 

background image

Literatura 

• Źródło: 
• http://kotu.pl/artykuly/strojenie-baz-danych-

optymalizacja-skladni-zapytan-sql.html