MySQL Index: Skapa, Lägg till och Släpp Handledning

⚡ Smart sammanfattning

MySQL Index-handledningen beskriver hur index sorterar och lokaliserar data snabbt. Ett index är en sorterad uppslagsstruktur som skapas på en eller flera kolumner; CREATE INDEX lägger till det, SHOW INDEXES inspekterar det och DROP INDEX tar bort det när skrivtunga tabeller överväger läsfördelarna.

  • 📚 Behandla index som en ordbok: De sorterar kolumnvärden så att motorn kan hitta rader utan att skanna hela tabellen.
  • 🛠️ Skapa vid bordet eller efter: Definiera ett index inline i CREATE TABLE eller lägg till det senare med CREATE INDEX i en live-tabell.
  • 🔍 Inspektera med VISA INDEX: Använd VISA INDEX FRÅN tabellnamn för att lista alla index-, nyckeldels-, kardinalitets- och unikhetsflaggor.
  • 🧹 Släpp när skrivkostnaden är för hög: Index saktar ner INSERT och UPDATE — ta bort oanvända index med DROP INDEX för att återställa skrivdataflödet.
  • 🤖 Använd AI för indexdesign: AI-assistenter läser loggar för långsamma frågor, föreslår kolumnordningar för sammansatta index och förklarar EXPLAIN-planer rad för rad.

MySQL Indexkoncept

Vad är en MySQL Index?

An index in MySQL är en datastruktur som lagrar kolumnvärden på ett ordnat sätt så att motorn snabbt kan söka upp rader. Index skapas på den eller de kolumner som oftast används för att filtrera data. Tänk på ett index som en alfabetiskt sorterad lista: det är mycket snabbare att hitta ett namn i en sorterad lista än i en osorterad hög.

Index har en avvägning – varje INSERT eller UPDATE måste underhålla indexet, så att lägga till för många index i en skrivtung tabell kan skada den totala prestandan. Som en tumregel bör kolumner som visas i WHERE-, JOIN- och ORDER BY-klausuler i tabeller som läses oftare än de skrivs till indexeras.

Varför använda ett index?

Ingen gillar långsamma system. Hög prestanda är en högsta prioritet för nästan alla databasbaserade applikationer. Företag spenderar stora summor pengar på hårdvara för att hålla frågorna snabba, men det finns ett tak för vad enbart hårdvara kan leverera. Att optimera index är en billigare och effektivare åtgärd.

MySQL Indexkoncept

Långsamma svarstider beror vanligtvis på att rader lagras i fysisk ordning på disken. Utan ett index, MySQL måste skanna varje rad för att hitta de som matchar ett predikat – en "fullständig tabellskanning". Index låter MySQL hoppar direkt till matchande rader, vilket omvandlar frågeplanen från O(n) till ungefär O(log n) för B-trädsökningar.

Syntax: Skapa index

Ett index kan definieras på två ställen:

  1. Vid tidpunkten för tabellskapandet.
  2. Efter att tabellen redan finns.

Exempel: Skapa ett index inline med CREATE TABLE

För myflixdb databasen, förväntar vi oss många sökningar i kolumnen för fullständigt namn. Skriptet nedan skapar en ny members_indexed tabell med ett index på full_names kolonn.

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;

Kör skriptet i MySQL Arbetsbänk mot myflixdb databas.

members_indexed tabell i MySQL Arbetsbänk

refresh myflixdb att se det nya members_indexed tabell. De full_names kolumnen visas nu under Index nod.

Allt eftersom medlemsantalet växer, sökfrågor på members_indexed som använder WHERE och ORDER BY mot full_names är mycket snabbare än samma frågor på originalet members tabell utan index.

Lägg till ett index efter att tabellen redan finns

Du kommer ofta att upptäcka att en befintlig tabell behöver ett index – sökfrågor är långsamma och en EXPLAIN-plan visar en fullständig tabellsökning på en kolumn som visas i WHERE. CREATE INDEX kommandot lägger till ett index utan att återskapa tabellen.

CREATE INDEX `id_index` ON `table_name` (`column_name`);

Konkret exempel — snabba upp sökningar på title kolumnen i movies tabell:

CREATE INDEX `title_index` ON `movies` (`title`);

Varje fråga som filtrerar på movies.title stöds nu av det nya indexet. Frågor som filtrerar på andra kolumner skannar fortfarande tabellen om de inte har ett eget index.

Obs: Du kan skapa ett sammansatt index över flera kolumner när dina frågor alltid filtrerar eller sorterar på samma kombination. Ordningen spelar roll – den inledande kolumnen avgör om indexet kan användas.

Lista index i en tabell

Använda SHOW INDEXES för att se varje index som definierats i en tabell.

SHOW INDEXES FROM `table_name`;

Exempel — lista index på movies tabell:

SHOW INDEXES FROM `movies`;

Kör satsen i MySQL Arbetsbänk mot myflixdb för att se befintliga index och de kolumner de täcker.

Obs: Primär- och främmande nycklar indexeras automatiskt av MySQLVarje index har ett unikt namn och listar den/de kolumn(er) det täcker.

Syntax: Släpp index

Använda DROP INDEX för att ta bort ett befintligt index från en tabell. Detta är användbart när en skrivtung tabell saktas ner av ett index som inte längre förtjänar sin plats på lässidan.

DROP INDEX `index_id` ON `table_name`;

Konkret exempel — släpp full_names index från members_indexed:

DROP INDEX `full_names` ON `members_indexed`;

Typer av MySQL Index

MySQL stöder flera indextyper, som var och en är lämpad för en annan arbetsbelastning.

Typ Syfte
PRIMÄRNYCKEL Unik radidentifierare; klustrad med tabelldata i InnoDB.
UNIK Framtvingar unikhet samtidigt som den fungerar som ett index.
INDEX (B-träd) Standard sekundärt index som används för intervallfrågor och likhetssökningar.
FULLTEXT Optimerad för textsökning på naturligt språk med MATCH … AGAINST.
RUMSLIG R-trädindex för GIS-datatyper som POINT och POLYGON.
HASCH Uppslagningar av likhet i konstant tid; används av MEMORY-lagringsmotorn.
Sammansatt (flerkolumn) Kombinerar flera kolumner till ett index; följer prefixregeln längst till vänster.

Bästa metoder för MySQL Index

Vanorna nedan håller index användbara och hindrar dem från att bli dödviktiga.

  • Index för frågemönstret, inte kolumnnamnet: lägg till index som matchar riktiga WHERE-, JOIN- och ORDER BY-klausuler, inte "varje kolumn som låter viktig".
  • Titta på kompositindexordning: Den inledande kolumnen måste finnas i frågan för att indexet ska kunna användas.
  • Undvik dubbletter av index: Ett inledande prefix i ett sammansatt index täcker redan sökningar med en kolumn på det prefixet.
  • Inspektera med FÖRKLARING: bekräfta att planeraren faktiskt väljer det nya indexet.
  • Ta bort oanvända index: användning sys.schema_unused_indexes in MySQL 5.7+ för att hitta index som ingenting läser.
  • Matchningsdatatyper: Om en WHERE-klausul jämför en VARCHAR-kolumn med ett tal kan indexet inte användas på grund av en implicit konverterad klausul.

Vanliga frågor

En primärnyckel identifierar varje rad unikt och är alltid indexerad. Ett generellt INDEX snabbar upp sökningar men tillåter duplicerade värden. Varje primärnyckel är ett index, men inte varje index är en primärnyckel.

Undvik index i mycket små tabeller, i kolumner med väldigt få distinkta värden (låg kardinalitet) och i tabeller som skrivs mycket oftare än de läses. Varje extra index saktar ner varje INSERT, UPDATE och DELETE.

Ett sammansatt index (med flera kolumner) täcker mer än en kolumn i ett enda index. Det följer prefixregeln längst till vänster, så det kan hantera frågor som filtrerar på den första kolumnen, de två första kolumnerna och så vidare, men inte enbart den andra kolumnen.

Körning EXPLAIN framför SELECT-satsen. Den nyckel kolumnen visar vilket index optimeraren valde, medan Typ och rader berätta om åtkomstvägen är effektiv.

Ett täckande index innehåller varje kolumn som frågan behöver, så sökmotorn besvarar frågan enbart från indexet utan att läsa tabellen. EXPLAIN rapporterar "Använder index" när detta händer.

Vanliga orsaker inkluderar omslagping kolumnen i en funktion (WHERE YEAR(col) = …), implicita typomvandlingar, mycket låg kardinalitet och inaktuell statistik. Kör ANALYZE TABLE för att uppdatera statistiken och granska EXPLAIN av den faktiska anledningen.

AI-assistenter matar in loggar för långsamma frågor, klassificerar de dyraste mönstren, föreslår index med en kolumn eller sammansatta index och förklarar EXPLAIN-planer på ett enkelt språk. De minskar finjusteringstiden från timmar till minuter för rutinmässiga arbetsbelastningar.

Ja. AI-verktyg omvandlar en förfrågan som "snabba upp kundsökningar via e-post och registreringsdatum" till ett fungerande CREATE INDEX-uttryck, rekommenderar kolumnordning och förklarar den förväntade effekten på läs- och skrivdata.

Sammanfatta detta inlägg med: