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
INSERT
opgeeft 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_offset
enauto_increment_increment
voor multi-master of geclusterde oplossingen. - Het is OK om iets anders als
PRIMARY KEY
en gewoonINDEX(id)
. (Dit is in sommige situaties een optimalisatie.) - Het gebruik van de
AUTO_INCREMENT
als 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
(watDELETE
plusINSERT
) en anderen.ROLLBACK
is 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
COMMIT
volgorde naar slaven verzonden.