Database
 sql >> Baza danych >  >> RDS >> Database

Jak działa indeksowanie?

Do czego służy indeksowanie?

Indeksowanie to sposób na uporządkowanie tabeli nieuporządkowanej, która zmaksymalizuje wydajność zapytania podczas wyszukiwania.

Gdy tabela nie jest indeksowana, kolejność wierszy prawdopodobnie nie będzie rozpoznawalna przez zapytanie jako zoptymalizowane w jakikolwiek sposób, a zatem zapytanie będzie musiało przeszukiwać wiersze liniowo. Innymi słowy, zapytania będą musiały przeszukać każdy wiersz, aby znaleźć wiersze spełniające warunki. Jak możesz sobie wyobrazić, może to zająć dużo czasu. Przeglądanie każdego wiersza nie jest zbyt wydajne.

Na przykład poniższa tabela przedstawia tabelę w fikcyjnym źródle danych, które jest całkowicie nieuporządkowane.

identyfikator_firmy jednostka unit_cost
10 12 1,15
12 12 1,05
14 18 1.31
18 18 1,34
11 24 1,15
16 12 1.31
10 12 1,15
12 24 1.3
18 6 1,34
18 12 1,35
14 12 1,95
21 18 1,36
12 12 1,05
20 6 1.31
18 18 1,34
11 24 1,15
14 24 1,05

Gdybyśmy mieli uruchomić następujące zapytanie:

SELECT
	company_id,
	units,
	unit_cost
FROM
	index_test
WHERE
	company_id = 18

Baza danych musiałaby przeszukiwać wszystkie 17 wierszy w kolejności, w jakiej pojawiają się w tabeli, od góry do dołu, po jednym na raz. Aby wyszukać wszystkie potencjalne wystąpienia company_id numer 18, baza danych musi przeszukać całą tabelę pod kątem wszystkich wystąpień 18 w company_id kolumna.

Stanie się to coraz bardziej czasochłonne wraz ze wzrostem rozmiaru stołu. Wraz ze wzrostem złożoności danych może się zdarzyć, że tabela z miliardem wierszy zostanie połączona z inną tabelą z miliardem wierszy; zapytanie musi teraz przeszukać dwa razy więcej wierszy kosztujących dwa razy więcej czasu.

Możesz zobaczyć, jak staje się to problematyczne w naszym stale nasyconym danymi świecie. Tabele powiększają się, a czas wyszukiwania wydłuża się.

Zapytanie o niezindeksowaną tabelę, jeśli jest przedstawione wizualnie, wyglądałoby tak:

To, co robi indeksowanie, to ustawia kolumnę, w której znajdują się warunki wyszukiwania, w posortowanej kolejności, aby pomóc w optymalizacji wydajności zapytań.

Z indeksem w company_id kolumna, tabela zasadniczo „wyglądałaby” tak:

identyfikator_firmy jednostka unit_cost
10 12 1,15
10 12 1,15
11 24 1,15
11 24 1,15
12 12 1,05
12 24 1.3
12 12 1,05
14 18 1.31
14 12 1,95
14 24 1,05
16 12 1.31
18 18 1,34
18 6 1,34
18 12 1,35
18 18 1,34
20 6 1.31
21 18 1,36

Teraz baza danych może wyszukać company_id numer 18 i zwróć wszystkie żądane kolumny dla tego wiersza, a następnie przejdź do następnego wiersza. Jeśli comapny_id w następnym wierszu liczba to również 18, to zwróci wszystkie kolumny wymagane w zapytaniu. Jeśli company_id w następnym wierszu wynosi 20, zapytanie wie, że należy zatrzymać wyszukiwanie, a zapytanie się zakończy.

Jak działa indeksowanie?

W rzeczywistości tabela bazy danych nie zmienia swojej kolejności za każdym razem, gdy zmieniają się warunki zapytania, aby zoptymalizować wydajność zapytania:byłoby to nierealne. W rzeczywistości indeks powoduje, że baza danych tworzy strukturę danych. Typ struktury danych to najprawdopodobniej B-Tree. Chociaż zalety B-Tree są liczne, główną zaletą dla naszych celów jest to, że można je sortować. Kiedy struktura danych jest posortowana w kolejności, nasze wyszukiwanie jest bardziej wydajne z oczywistych powodów, które wskazaliśmy powyżej.

Gdy indeks tworzy strukturę danych w określonej kolumnie, należy pamiętać, że żadna inna kolumna nie jest przechowywana w strukturze danych. Nasza struktura danych dla powyższej tabeli będzie zawierać tylko company_id liczby. Jednostki i unit_cost nie będą przechowywane w strukturze danych.

Skąd baza danych wie, jakie inne pola w tabeli mają zostać zwrócone?

Indeksy bazy danych będą również przechowywać wskaźniki, które są po prostu informacjami referencyjnymi dotyczącymi lokalizacji dodatkowych informacji w pamięci. Zasadniczo indeks zawiera company_id i adres domowy tego konkretnego wiersza na dysku pamięci. Indeks będzie wyglądał tak:

identyfikator_firmy wskaźnik
10 _123
10 _129
11 _127
11 _138
12 _124
12 _130
12 _135
14 _125
14 _131
14 _133
16 _128
18 _126
18 _131
18 _132
18 _137
20 _136
21 _134

Za pomocą tego indeksu zapytanie może wyszukiwać tylko wiersze w company_id kolumna, która ma 18, a następnie za pomocą wskaźnika może przejść do tabeli, aby znaleźć konkretny wiersz, w którym znajduje się ten wskaźnik. Zapytanie może następnie przejść do tabeli, aby pobrać pola dla żądanych kolumn dla wierszy, które spełniają warunki.

Gdyby wyszukiwanie zostało przedstawione wizualnie, wyglądałoby to tak:

Podsumowanie

  • Indeksowanie dodaje strukturę danych z kolumnami dla warunków wyszukiwania i wskaźnikiem
  • Wskaźnik to adres na dysku pamięci wiersza z resztą informacji
  • Struktura danych indeksu jest sortowana w celu optymalizacji wydajności zapytań
  • Zapytanie szuka określonego wiersza w indeksie; indeks odnosi się do wskaźnika, który znajdzie resztę informacji.
  • Indeks zmniejsza liczbę wierszy, które zapytanie musi przeszukać, z 17 do 4.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Porównywanie obiektów według wartości. Część 6:Wdrażanie równości struktury

  2. 10 przydatnych zasobów dla tych, którzy chcą dowiedzieć się więcej o SQL

  3. Mity dotyczące wydajności:Nadwymiarowe kolumny ciągów

  4. Typowe wyrażenia tabelowe:kiedy i jak ich używać

  5. Podstawy wyrażeń tabelarycznych, Część 8 – CTE, rozważania dotyczące optymalizacji ciąg dalszy