7.1 Powody pojawienia się indeksów

Kolejną ważną rzeczą, bez której nie może być baz danych, są indeksy.

Wyobraź sobie sytuację, w której w tabeli user znajduje się 10 milionów użytkowników i chcesz wyświetlić wszystkich, którzy mają poziom powyżej 90. To zapytanie jest bardzo proste do napisania:

SELECT * FROM user WHERE level > 90

Świetnie, napisaliśmy prośbę w mniej niż minutę. Ile czasu zajmie wykonanie tego zapytania z serwera SQL? Aby wykonać takie zapytanie, będzie musiał przejść przez 10 milionów rekordów, a nawet jeśli jest tylko jeden rekord, zajmie to dużo czasu.

Jak wykonalibyśmy podobne zadanie w Javie? Najpierw sortowalibyśmy kolekcję użytkowników według poziomu, a następnie moglibyśmy bardzo szybko znaleźć potrzebne rekordy za pomocą wyszukiwania binarnego. Mam nadzieję, że nie muszę tłumaczyć, o co chodzi?

Świetnie, ale co, jeśli teraz musimy wybrać użytkowników, których data rejestracji przypadała przed 2020 rokiem? Posortuj ponownie według daty rejestracji i użyj wyszukiwania binarnego.

Tak, jeśli wykonamy filtr na jakimś polu, i to nie raz, ale często, to bardzo przydatne będzie przechowywanie danych posortowanych według tego pola.

A jak przechowywać dane posortowane jednocześnie według różnych pól?

A odpowiedź jest bardzo prosta - musisz przechowywać nie same dane, ale ich indeksy w jakiejś globalnej tabeli.

Załóżmy, że jest 10 użytkowników o identyfikatorze: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

I zdecydujesz się posortować je według poziomu, wtedy tablica ich id będzie wyglądać na przykład tak: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

A jeśli posortujemy je według dat, to otrzymamy np.: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Tablice o tych identyfikatorach nazywane są indeksami . Same elementy są duże, nie dotykamy ich. W Javie nie dotykamy obiektów, ale przechowujemy ich referencje; w SQL nie dotykamy prawdziwych ciągów znaków, ale przechowujemy ich numery.

Pozwól, że przepiszę to w kodzie Java:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Sortowanie kolekcji nie oznacza przenoszenia rzeczywistych elementów. Kolekcja nie przechowuje rzeczywistych obiektów, ale linki do nich. To samo dotyczy tabel SQL. Prawdziwe linie okłamują siebie i kłamią.

A kiedy musimy często dokonywać selekcji dla jakiegoś pola, to dodajemy kolejny indeks do tabeli (analogicznie do nowej kolekcji w Javie) i sortujemy wiersze tabeli, przechowujemy ich posortowaną kolejność w specjalnym pliku indeksu.

Mam nadzieję, że porównanie Javy trochę pomogło. Trochę wprawy - a dla Ciebie użycie indeksów również stanie się najbardziej oczywistym rozwiązaniem.

7.2 Dodawanie indeksów do tabeli

Indeks można określić bezpośrednio podczas tworzenia tabeli lub dodać później. Najczęściej występuje drugi scenariusz – indeksy są dodawane wraz ze wzrostem rozmiaru tabeli i spowolnieniem próbkowania danych.

Dodanie indeksu do tabeli jest bardzo proste:

ALTER TABLE table
    ADD INDEX index_name (column);

Jeśli często przeglądasz rekordy w wielu kolumnach jednocześnie, możesz określić indeks złożony: SQL używa wielu kolumn, aby go utworzyć.

Dodanie indeksu złożonego do tabeli jest również bardzo proste:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Indeksy zajmują dużo miejsca na dysku, więc jeśli nie potrzebujesz już indeksu, zawsze możesz go usunąć:

ALTER TABLE table
    DROP INDEX index_name;

Same indeksy są raczej ukrytą częścią bazy danych. Nie wpływają one w żaden sposób na format pisania zapytań. Po prostu ich obecność przyspiesza próbkowanie danych i spowalnia ich dodawanie i tworzenie kopii zapasowych.

Ale biorąc pod uwagę, jak ważna jest szybkość w dzisiejszym świecie i jak tanie jest miejsce na dysku, możesz dodawać indeksy na każdą okazję. Przepraszam adminów...