CREATE INDEX - przyspieszenie zapytań

2009-12-06 14:06

CREATE INDEX - przyspieszenie zapytań

Pora sobie odpowiedzieć na pytanie kiedy i w jaki sposób warto zastosować index by przyspieszyć nasze zapytania.

Mamy kilka typów indeksów, ale używać będziemy domyślnego, czyli B-tree. Nie jest to moje widzi misie, ale te pozostałe są po prostu specjalistyczne. Nie chciałbym tutaj przepisywać dokumentacji, toteż wspomnę tylko, że B-tree służy nam gdy używamy operatorów: <, <=, =, >=, >, BETWEEN, IN, IS NULL, a także po spełnieniu pewnych warunków (patrz dokumentacja) LIKE i ILIKE.

Na różnych forach, artykułach można przeczytać, że w przypadku małej ilości danych w tabeli nie warto zakładać indeksów z uwagi na to, że mogą one zamiast przyspieszyć spowolnić otrzymanie wyników. Kolejną rzeczą, którą chce pokazać to jak diametralnie można przyspieszyć zapytania.

Stworzyłem 6 tabel, które wypełniłem odpowiednią ilością rekordów: 20, 200, 2 000, 20 000, 200 000 i 2 000 000. Z początku miałem 4 kolumny: varchar(32) (unikalne wartości), varchar(32), int (unikalne wartości), int. Okazało się jednak, że typ oraz to czy są w tabeli unikalne wartości nie ma znaczenia. Do testów użyłem zwykłego zapytania z warunkiem WHERE = 'jakaś wartość'.

rekordów bez INDEX z INDEX
20 0.05ms (cost=0.00..1.25 rows=1 width=71) 0.05ms (cost=0.00..1.25 rows=1 width=71)
200 0.05ms (cost=0.00..5.50 rows=1 width=71) 0.05ms (cost=0.00..5.50 rows=1 width=71)
2 000 0.6ms (cost=0.00..76.00 rows=1 width=71) 0.05ms (cost=0.00..8.27 rows=1 width=71)
20 000 7ms (cost=0.00..502.00 rows=1 width=71) 0.06ms (cost=0.00..8.27 rows=1 width=71)
200 000 80ms (cost=0.00..5013.00 rows=1 width=71) 0.06ms (cost=0.00..8.34 rows=1 width=71)
2 000 000 700ms (cost=0.00..50130.00 rows=1 width=71) 0.3ms (cost=0.00..8.80 rows=1 width=71)

Dodanie indeksu bezapelacyjnie poprawiło czas wykonywania zapytania w przypadku dużej liczby rekordów. W przypadku 20 i 200 rekordów silnik bazy nie skorzystał z indeksów z uwagi na zbyt małą liczbę rekordów w bazie i wynik był taki jakby indeksu nie było.

Słowa kluczowe: PostgreSQL, Techblog, btree, create, index, sql, artykuł, blog

Projektowanie i tworzenie stron www w PHP5. Opisy i recenzje oprogramowania typu cms, blog, wiki, open source.
Wszelkie prawa zastrzeżone.