7.1 Motivele apariției indicilor

Un alt lucru important fără de care nu pot exista baze de date sunt indexurile.

Imaginați-vă o situație în care există 10 milioane de utilizatori în tabelul de utilizatori și doriți să afișați toți cei care au un nivel peste 90. Această interogare este foarte simplu de scris:

SELECT * FROM user WHERE level > 90

Super, am scris cererea în mai puțin de un minut. Și cât timp va dura pentru a executa această interogare de pe serverul SQL? Pentru a executa o astfel de interogare, va trebui să treacă prin 10 milioane de înregistrări și, chiar dacă există o singură înregistrare, va dura mult timp.

Cum am face o sarcină similară în Java? Am sorta mai întâi colecția de utilizatori după nivel și apoi am putea găsi foarte rapid înregistrările necesare folosind o căutare binară. Sper că nu trebuie să explic ce este?

Grozav, dar dacă acum trebuie să selectăm utilizatori a căror dată de înregistrare a fost înainte de 2020? Sortați din nou după data înregistrării și utilizați căutarea binară.

Da, dacă efectuăm un filtru pe un anumit câmp, și nu doar o dată, ci de multe ori, atunci va fi foarte util să stocăm datele sortate după acest câmp.

Și cum să stochezi datele sortate simultan pe diferite câmpuri?

Și răspunsul este foarte simplu - trebuie să stocați nu datele în sine, ci indecșii lor într-un tabel global.

Să presupunem că există 10 utilizatori cu id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Și decideți să le sortați după nivel, atunci matricea id-ului lor va fi, de exemplu, astfel: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Și dacă le sortăm după dată, atunci obținem, de exemplu: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Matricele acestor id-uri sunt numite indexuri . Elementele în sine sunt mari, nu le atingem. În Java, nu atingem obiecte, ci le stocăm referințele; în SQL, nu atingem șiruri reale, ci le stocăm numerele.

Lasă-mă să rescriu asta în cod 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

Sortarea colecțiilor nu înseamnă mutarea elementelor reale. Colecția nu stochează obiecte reale, ci legături către acestea. Același lucru este valabil și pentru tabelele SQL. Liniile reale se mint singure și mint.

Și când trebuie să facem frecvent selecții pentru un câmp, atunci adăugăm un alt index la tabel (analog cu o nouă colecție în Java) și sortăm rândurile tabelului, stocăm ordinea lor sortată într-un fișier index special.

Sper că comparația Java a ajutat puțin. Puțină practică - și pentru tine, utilizarea indicilor va deveni și cea mai evidentă soluție.

7.2 Adăugarea de indici la un tabel

Indexul poate fi specificat imediat în timpul creării tabelului sau adăugat după. Cel mai adesea, este al doilea scenariu care apare - se adaugă indici pe măsură ce dimensiunea tabelului crește și eșantionarea datelor încetinește.

Adăugarea unui index la un tabel este foarte simplă:

ALTER TABLE table
    ADD INDEX index_name (column);

Dacă căutați adesea înregistrări în mai multe coloane în același timp, puteți specifica un index compus: SQL folosește mai multe coloane pentru al compune.

Adăugarea unui index compus la un tabel este, de asemenea, foarte simplă:

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

Indecșii ocupă mult spațiu pe disc, așa că dacă nu mai aveți nevoie de un index, îl puteți elimina oricând:

ALTER TABLE table
    DROP INDEX index_name;

Indicii în sine sunt o parte destul de ascunsă a bazei de date. Ele nu afectează în niciun fel formatul de scriere a interogărilor. Doar că prezența lor accelerează eșantionarea datelor și încetinește adăugarea și copierea lor de rezervă.

Dar având în vedere cât de importantă este viteza în lumea de astăzi și cât de ieftin este spațiul pe disc, nu ezitați să adăugați indici pentru toate ocaziile. Iertați-mă administratori...