MySQL
Indexen en toetsen
Zoeken…
Syntaxis
- Maak een eenvoudige index
CREATE INDEX index_name ON table_name (column_name1 [, column_name2, ...])
- Maak een unieke index
CREATE UNIQUE INDEX index_name ON table_name (column_name1 [, column_name2, ...]
- Drop index
DROP INDEX indexnaam AAN tbl_naam [ algorithm_option | lock_option ] ...
algorithm_option: ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option: LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
Opmerkingen
Concepts
Een index in een MySQL-tabel werkt als een index in een boek.
Stel dat u een boek over databases hebt en dat u wat informatie wilt vinden over bijvoorbeeld opslag. Zonder een index (ervan uitgaande dat er geen ander hulpmiddel is, zoals een inhoudsopgave), moet u de pagina's een voor een doorlopen totdat u het onderwerp vindt (dat is een "volledige tabelscan"). Aan de andere kant heeft een index een lijst met trefwoorden, dus u zou de index raadplegen en zien dat opslag wordt vermeld op pagina's 113-120, 231 en 354. Dan kunt u direct naar die pagina's bladeren, zonder te zoeken (dat is een zoekopdracht met een index, iets sneller).
Natuurlijk hangt het nut van de index van veel dingen af - een paar voorbeelden, met behulp van het bovenstaande voorbeeld:
- Als u een boek over databases had en het woord "database" had geïndexeerd, ziet u misschien dat het op pagina's 1-59, 61-290 en 292-400 wordt vermeld. Dat zijn veel pagina's, en in zo'n geval helpt de index niet veel en is het misschien sneller om de pagina's een voor een te doorlopen. (In een database is dit "slechte selectiviteit".)
- Voor een boek van 10 pagina's heeft het geen zin om een index te maken, want je kunt eindigen met een boek van 10 pagina's voorafgegaan door een index van 5 pagina's, wat gewoon dwaas is - scan gewoon de 10 pagina's en je bent klaar .
- De index moet ook nuttig zijn - het heeft over het algemeen geen zin om te indexeren, bijvoorbeeld de frequentie van de letter "L" per pagina.
Maak index
-- Create an index for column 'name' in table 'my_table'
CREATE INDEX idx_name ON my_table(name);
Maak een unieke index
Een unieke index voorkomt het invoegen van dubbele gegevens in een tabel. NULL waarden kunnen worden ingevoegd in de kolommen die deel uitmaken van de unieke index (aangezien een NULL waarde per definitie verschilt van elke andere waarde, inclusief een andere NULL waarde)
-- Creates a unique index for column 'name' in table 'my_table'
CREATE UNIQUE INDEX idx_name ON my_table(name);
Drop index
-- Drop an index for column 'name' in table 'my_table'
DROP INDEX idx_name ON my_table;
Maak een samengestelde index
Dit maakt een samengestelde index van beide sleutels, mystring en mydatetime en versnelt query's met beide kolommen in de WHERE component.
CREATE INDEX idx_mycol_myothercol ON my_table(mycol, myothercol)
Let op: De bestelling is belangrijk! Als de zoekopdracht niet beide kolommen in de WHERE component bevat, kan deze alleen de meest linkse index gebruiken. In dit geval, een query met mycol in de WHERE zal de index een query zoeken naar gebruik myothercol zonder ook op zoek naar mycol niet. Bekijk dit blogbericht voor meer informatie.
Opmerking: Vanwege de manier waarop BTREE werkt, moeten kolommen die gewoonlijk in bereiken worden opgevraagd, de meest rechtse waarde hebben. DATETIME kolommen worden bijvoorbeeld DATETIME opgevraagd zoals WHERE datecol > '2016-01-01 00:00:00' . BTREE-indexen verwerken bereiken zeer efficiënt, maar alleen als de kolom die als bereik wordt opgevraagd, de laatste is in de samengestelde index.
AUTO_INCREMENT-toets
CREATE TABLE (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY(id),
... );
Hoofdnoten:
- Begint met 1 en wordt automatisch met 1 verhoogd als u het niet op
INSERTopgeeft of opgeeft alsNULL. - De id's zijn altijd verschillend van elkaar, maar ...
- Maak geen aannames (geen gaten, opeenvolgend gegenereerd, niet hergebruikt, enz.) Over de waarden van de id anders dan op enig moment uniek te zijn.
Subtiele noten:
- Bij het herstarten van de server wordt de 'volgende' waarde 'berekend' als
MAX(id)+1. - Als de laatste bewerking vóór het afsluiten of crash was om de hoogste id verwijdert, kan dat id worden hergebruikt (dit is de motor-afhankelijk). Vertrouw dus niet op auto_increments als permanent uniek ; ze zijn alleen uniek op elk moment.
- Zie
auto_increment_offsetenauto_increment_incrementvoor multi-master of geclusterde oplossingen. - Het is OK om iets anders als
PRIMARY KEYen gewoonINDEX(id). (Dit is in sommige situaties een optimalisatie.) - Het gebruik van de
AUTO_INCREMENTals de "PARTITION" is zelden voordelig; doe iets anders. - Verschillende bewerkingen kunnen waarden "verbranden". Dit gebeurt wanneer ze vooraf waarde (n) toewijzen en deze vervolgens niet gebruiken:
INSERT IGNORE(met dup-sleutel),REPLACE(watDELETEplusINSERT) en anderen.ROLLBACKis een andere oorzaak voor hiaten in ID's. - In Replication kunt u niet vertrouwen dat id's in oplopende volgorde bij de slave (s) aankomen. Hoewel id's in opeenvolgende volgorde worden toegewezen, worden InnoDB-instructies in de
COMMITvolgorde naar slaven verzonden.