7.1 Az indexek megjelenésének okai

Egy másik fontos dolog, ami nélkül nem létezhetnek adatbázisok, az indexek.

Képzeljünk el egy olyan helyzetet, amikor 10 millió felhasználó van a felhasználói táblázatban , és mindenkit meg szeretne jeleníteni, aki 90 feletti szinttel rendelkezik. Ezt a lekérdezést nagyon egyszerű megírni:

SELECT * FROM user WHERE level > 90

Remek, alig egy perc alatt megírtuk a kérést. És mennyi ideig tart a lekérdezés végrehajtása az SQL szerverről? Egy ilyen lekérdezés végrehajtásához 10 millió rekordon kell keresztülmennie, és még ha csak egy rekord is van, az sok időt vesz igénybe.

Hogyan végeznénk el egy hasonló feladatot Java nyelven? Először szintek szerint rendeznénk a felhasználók gyűjteményét, majd egy bináris kereséssel nagyon gyorsan megtaláltuk a szükséges rekordokat. Remélem, nem kell elmagyaráznom, mi ez?

Remek, de mi van, ha most olyan felhasználókat kell kiválasztanunk, akiknek regisztrációs dátuma 2020 előtt volt? Rendezze újra a regisztráció dátuma szerint, és használja a bináris keresést.

Igen, ha valamilyen mezőn végrehajtunk egy szűrőt, és nem csak egyszer, hanem gyakran, akkor nagyon hasznos lesz az adatokat e mező szerint rendezve tárolni.

És hogyan lehet egyszerre különböző mezők szerint rendezett adatokat tárolni?

A válasz pedig nagyon egyszerű - nem magát az adatokat, hanem azok indexeit kell tárolnia valamilyen globális táblában.

Tegyük fel, hogy 10 felhasználó van a következő azonosítóval: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

És úgy dönt, hogy szint szerint rendezi őket, akkor az azonosítójuk tömbje például a következő lesz: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Ha pedig dátum szerint rendezzük őket, akkor pl.: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Ezen azonosítók tömbjeit indexeknek nevezzük . Maguk az elemek nagyok, nem nyúlunk hozzájuk. Java-ban nem érintjük meg az objektumokat, hanem tároljuk a hivatkozásaikat, az SQL-ben nem a valódi karakterláncokat érintjük, hanem a számukat tároljuk.

Hadd írjam át ezt Java kódban:

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

A gyűjtemények rendezése nem jelenti a tényleges elemek áthelyezését. A gyűjtemény nem valós tárgyakat tárol, hanem linkeket azokra. Ugyanez igaz az SQL táblákra is. Az igazi vonalak hazudnak maguknak és hazudnak.

És ha gyakran kell kiválasztanunk egy mezőt, akkor hozzáadunk egy másik indexet a táblához (a Java új gyűjteményéhez hasonlóan), és rendezzük a tábla sorait, és egy speciális indexfájlban tároljuk a rendezési sorrendet.

Remélem, a Java összehasonlítás segített egy kicsit. Egy kis gyakorlat – és számodra is az indexek használata lesz a legkézenfekvőbb megoldás.

7.2 Indexek hozzáadása egy táblázathoz

Az index a tábla létrehozása során azonnal megadható, vagy utána hozzáadható. Leggyakrabban a második forgatókönyv fordul elő – az indexek a táblázat méretének növekedésével és az adatmintavétel lelassulásával kerülnek hozzáadásra.

Az index hozzáadása a táblázathoz nagyon egyszerű:

ALTER TABLE table
    ADD INDEX index_name (column);

Ha gyakran keres egyidejűleg több oszlopban lévő rekordokat, megadhat egy összetett indexet: az SQL több oszlopot használ az összeállításához.

Összetett index hozzáadása a táblázathoz szintén nagyon egyszerű:

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

Az indexek sok lemezterületet foglalnak el, így ha már nincs szüksége indexre, bármikor eltávolíthatja:

ALTER TABLE table
    DROP INDEX index_name;

Maguk az indexek meglehetősen rejtett részei az adatbázisnak. Semmilyen módon nem befolyásolják a lekérdezések írási formátumát. Csak arról van szó, hogy jelenlétük felgyorsítja az adatmintavételezést, és lelassítja a hozzáadásukat és a biztonsági mentésüket.

De figyelembe véve, hogy a sebesség mennyire fontos a mai világban, és milyen olcsó a lemezterület, nyugodtan adjon hozzá indexeket minden alkalomra. Bocsáss meg adminok...