Hvad er et indeks?
Indekser i MySQL sorterer data på en organiseret sekventiel måde. De oprettes i kolonnerne, der bruges til at filtrere dataene. Tænk på et indeks som en alfabetisk sorteret liste. Det er lettere at slå navne op, der er sorteret i alfabetisk rækkefølge, end navne, der ikke er sorteret.
Brug af et indeks på tabeller, der ofte opdateres, kan resultere i dårlig ydeevne. Dette skyldes, at MySQL opretter en ny indeksblok, hver gang data tilføjes eller opdateres i tabellen. Generelt skal indekser bruges på tabeller, hvis data ikke ændres hyppigt, men bruges meget i udvalgte søgeforespørgsler.
Hvad bruger et indeks?
Ingen kan lide langsomme systemer. Høj systemydelse er af største betydning i næsten alle databasesystemer. De fleste virksomheder investerer kraftigt i hardware, så datahentninger og manipulationer kan ske hurtigere. Men der er grænse for hardwareinvesteringer, som en virksomhed kan foretage. Optimering af din database er en billigere og bedre løsning.
Langsomheden i svartiden skyldes normalt, at optegnelserne gemmes tilfældigt i databasetabeller. Søgeforespørgsler skal løbe gennem alle tilfældigt gemte poster efter hinanden for at finde de ønskede data. Dette resulterer i dårlige databaser med hensyn til at hente data fra store tabeller. Derfor bruges indekser, der sorterer data for at gøre det lettere at søge.
Syntaks: Opret indeks
Indeks kan defineres på to måder
- På tidspunktet for bordoprettelsen
- Efter at tabellen er oprettet
For vores myflixdb forventer vi masser af søgninger til databasen med fuldt navn.
Vi tilføjer kolonnen "fulde_navne" til indeks i en ny tabel "medlemmer_indekseret".
Nedenstående script hjælper os med at opnå det.
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;
Udfør ovenstående SQL-script i MySQL-arbejdsbænken mod "myflixdb".
Opdatering af myflixdb viser den nyoprettede tabel med navnet members_indexed.
"Note" members_indexed-tabel har "fulde_navne" i indeksnoden.
Efterhånden som medlemsbasen udvides, og antallet af poster øges, vil søgeforespørgsler på medlems_indexed-tabellen, der bruger WHERE- og ORDER BY-klausulerne, være meget hurtigere sammenlignet med dem, der udførte medlemstabellen uden indekset defineret.
Tilføj indeks grundlæggende syntaks
Ovenstående eksempel oprettede indekset, når databasetabellen blev defineret. Antag, at vi allerede har defineret en tabel, og søgeforespørgsler om den er meget langsomme. De tager for lang tid at returnere resultaterne. Efter at have undersøgt problemet opdager vi, at vi i høj grad kan forbedre systemets ydeevne ved at oprette INDEX i den mest anvendte kolonne i WHERE-klausulen.
Vi kan bruge følgende forespørgsel til at tilføje indeks
CREATE INDEX id_index ON table_name(column_name);
Lad os antage, at søgeforespørgsler på filmtabellen er meget langsomme, og vi vil bruge et indeks på "filmtitlen" til at fremskynde forespørgslerne, vi kan bruge følgende script til at opnå det.
CREATE INDEX `title_index` ON `movies`(`title`);
Udførelse af ovenstående forespørgsel opretter et indeks over titelfeltet i filmtabellen.
Dette betyder, at alle søgeforespørgsler på filmtabellen ved hjælp af "titlen" vil være hurtigere.
Søgeforespørgsler på andre felter i filmtabellen vil dog stadig være langsommere sammenlignet med dem, der er baseret på det indekserede felt.
Bemærk: Du kan om nødvendigt oprette indekser på flere kolonner afhængigt af de felter, du vil bruge til din databasesøgemaskine.
Hvis du vil se de indekser, der er defineret i en bestemt tabel, kan du bruge følgende script til at gøre det.
SHOW INDEXES FROM table_name;
Lad os nu se på alle de indekser, der er defineret på filmtabellen i myflixdb.
SHOW INDEXES FROM `movies`;
At udføre ovenstående script i MySQL-arbejdsbænken mod myflixdb giver os resultater på indeks oprettet.
Bemærk: De primære og udenlandske nøgler på bordet er allerede blevet indekseret af MySQL. Hvert indeks har sit eget unikke navn, og den kolonne, det er defineret på, vises også.
Syntaks: Drop index
Drop-kommandoen bruges til at fjerne allerede definerede indekser på en tabel.
Der kan være tidspunkter, hvor du allerede har defineret et indeks på en tabel, der ofte opdateres. Det kan være en god idé at fjerne indekserne på en sådan tabel for at forbedre effektiviteten af UPDATE og INSERT-forespørgsler. Den grundlæggende syntaks, der bruges til at droppe et indeks på en tabel, er som følger.
DROP INDEX `index_id` ON `table_name`;
Lad os nu se på et praktisk eksempel.
DROP INDEX ` full_names` ON `members_indexed`;
Udførelse af ovenstående kommando dråber indekset med id 'fulde_navne' fra members_indexed-tabellen.
Resumé
- Indekser er meget effektive, når det kommer til at forbedre ydeevnen af MySQL-søgeforespørgsler.
- Indeks kan defineres ved oprettelse af en tabel eller tilføjes senere, efter at tabellen allerede er oprettet.
- Du kan definere indekser i mere end en kolonne i en tabel.
- VIS INDEKS FRA tabelnavn bruges til at vise de definerede indekser på en tabel.
- DROP-kommandoen bruges til at fjerne et defineret indeks på en given tabel.