Što je indeks?
Indeksi u MySQL-u sortiraju podatke organizirano u slijedu. Stvoreni su u stupcu (cima) koji će se koristiti za filtriranje podataka. Zamišljajte indeks kao abecedno poredani popis. Lakše je potražiti imena koja su poredana po abecedi nego ona koja nisu sortirana.
Korištenje indeksa na tablicama koje se često ažuriraju može rezultirati lošom izvedbom. To je zato što MySQL stvara novi indeksni blok svaki put kad se podaci dodaju ili ažuriraju u tablici. Općenito, indekse treba koristiti na tablicama čiji se podaci ne mijenjaju često, ali se često koriste u odabranim upitima za pretraživanje.
Što koristiti indeksu?
Nitko ne voli spore sustave. Visoke performanse sustava od primarne su važnosti u gotovo svim sustavima baza podataka. Većina tvrtki ulaže velika sredstva u hardver kako bi pronalaženje podataka i manipulacije mogli biti brži. Ali postoji ograničenje ulaganja u hardver koje poduzeće može napraviti. Optimizacija baze podataka jeftinije je i bolje rješenje.
Sporost u vremenu odziva obično je posljedica slučajnog pohranjivanja zapisa u tablicama baze podataka. Upiti za pretraživanje moraju se petljati kroz čitav nasumično pohranjene zapise jedan za drugim da bi pronašli željene podatke. To rezultira lošim bazama podataka kada je riječ o preuzimanju podataka iz velikih tablica. Stoga se koriste indeksi koji sortiraju podatke radi lakšeg pretraživanja.
Sintaksa: Stvori indeks
Indeksi se mogu definirati na 2 načina
- U vrijeme izrade tablice
- Nakon izrade tablice
Za naš myflixdb očekujemo puno pretraživanja baze podataka s punim imenom.
U indeks ćemo dodati stupac "puna_imena" u novu tablicu "members_indexed".
Skripta prikazana u nastavku pomaže nam da to postignemo.
CREATE TABLE `members_indexed` (`membership_number` int(11) NOT NULL AUTO_INCREMENT,`full_names` varchar(150) DEFAULT NULL,`gender` varchar(6) DEFAULT NULL,`date_of_birth` date DEFAULT NULL,`physical_address` varchar(255) DEFAULT NULL,`postal_address` varchar(255) DEFAULT NULL,`contact_number` varchar(75) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,PRIMARY KEY (`membership_number`),INDEX(full_names)) ENGINE=InnoDB;
Izvršite gornju SQL skriptu u MySQL radnom stolu protiv "myflixdb".
Osvježavanjem myflixdb prikazuje se novostvorena tablica pod nazivom members_indexed.
Tablica "note" members_indexed ima "full_names" u čvoru indeksa.
Kako se baza članova širi, a broj zapisa povećava, upiti za pretraživanje u tablici members_indexed koji koriste klauzule WHERE i ORDER BY bit će mnogo brži u usporedbi s onima koje se izvode u tablici članova bez definiranog indeksa.
Dodajte osnovnu sintaksu indeksa
Gornji je primjer stvorio indeks prilikom definiranja tablice baze podataka. Pretpostavimo da već imamo definiranu tablicu i da su upiti za pretraživanje na njoj vrlo spori. Predugo im treba da vrate rezultate. Nakon istrage problema otkrivamo da možemo uvelike poboljšati izvedbu sustava stvaranjem INDEX-a na najčešće korištenom stupcu u klauzuli WHERE.
Za dodavanje indeksa možemo koristiti sljedeći upit
CREATE INDEX id_index ON table_name(column_name);
Pretpostavimo da su upiti za pretragu na tablici filmova vrlo spori i želimo koristiti indeks na "naslovu filma" da bismo ubrzali upite, možemo to upotrijebiti sljedećom skriptom.
CREATE INDEX `title_index` ON `movies`(`title`);
Izvršenjem gornjeg upita stvara se indeks na polju naslova u tablici filmova.
To znači da će svi upiti za pretraživanje na tablici filmova pomoću "naslova" biti brži.
Upiti za pretraživanje na drugim poljima u tablici filmova i dalje će biti sporiji u usporedbi s onima koji se temelje na indeksiranom polju.
Napomena: Ako je potrebno, možete stvoriti indekse na više stupaca, ovisno o poljima koja namjeravate koristiti za svoju tražilicu baze podataka.
Ako želite pregledati indekse definirane na određenoj tablici, za to možete upotrijebiti sljedeću skriptu.
SHOW INDEXES FROM table_name;
Pogledajmo sada sve indekse definirane na tablici filmova u myflixdb.
SHOW INDEXES FROM `movies`;
Izvršavanje gornje skripte u MySQL radnom stolu protiv myflixdb daje nam rezultate na stvorenom indeksu.
Napomena: MySQL je već indeksirao primarne i strane ključeve na tablici. Svaki indeks ima svoje jedinstveno ime, a prikazan je i stupac na kojem je definiran.
Sintaksa: indeks ispuštanja
Naredba drop koristi se za uklanjanje već definiranih indeksa iz tablice.
Mogu biti slučajevi kada ste već definirali indeks na tablici koji se često ažurira. Možda ćete htjeti ukloniti indekse iz takve tablice kako biste poboljšali izvedbu UPDATE i INSERT upita. Osnovna sintaksa koja se koristi za ispuštanje indeksa na tablicu je kako slijedi.
DROP INDEX `index_id` ON `table_name`;
Pogledajmo sada praktični primjer.
DROP INDEX ` full_names` ON `members_indexed`;
Izvršavanje gornje naredbe ispušta indeks s id `puna_imena` iz tablice members_indexed.
Sažetak
- Indeksi su vrlo moćni kada je riječ o značajnom poboljšanju izvedbe MySQL upita za pretraživanje.
- Indeksi se mogu definirati pri stvaranju tablice ili dodati kasnije nakon što je tablica već stvorena.
- Možete definirati indekse na više stupaca na tablici.
- SHOW INDEX FROM table_name koristi se za prikaz definiranih indeksa na tablici.
- Naredba DROP koristi se za uklanjanje definiranog indeksa iz zadane tablice.