INDEKS: indeksy

All lectures for PL purposes
Poziom 1, Lekcja 270
Dostępny

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...

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION