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...
GO TO FULL VERSION