I den här handledningen kommer vi att täcka några av grunderna för indexering. Som en del av MySQL-serien kommer vi att introducera funktionerna för MySQL-indexering och den roll det spelar för att optimera databasprestanda. Liquid Web rekommenderar att du rådgör med en DBA innan du gör några ändringar i din applikation på produktionsnivå.
Vad är indexering?
Indexering är en kraftfull struktur i MySQL som kan utnyttjas för att få de snabbaste svarstiderna från vanliga frågor. MySQL-frågor uppnår effektivitet genom att generera en mindre tabell, kallad ett index, från en specificerad kolumn eller uppsättning kolumner. Dessa kolumner, som kallas en nyckel, kan användas för att framtvinga unikhet. Nedan är en enkel visualisering av ett exempelindex med två kolumner som nyckel.
+------+----------+----------+
| ROW | COLUMN_1 | COLUMN_2 |
+------+----------+----------+
| 1 | data1 | data2 |
+------+----------+----------+
| 2 | data1 | data1 |
+------+----------+----------+
| 3 | data1 | data1 |
+------+----------+----------+
| 4 | data1 | data1 |
+------+----------+----------+
| 5 | data1 | data1 |
+------+----------+----------+
Frågor använder index för att identifiera och hämta måldata, även om de är en kombination av nycklar. Utan ett index resulterar körning av samma fråga i en inspektion av varje rad för den data som behövs. Indexering ger en genväg med mycket snabbare frågetider på expansiva tabeller. En analogi av läroböcker kan ge ett annat vanligt sätt att visualisera hur index fungerar.
När ska man aktivera indexering?
Indexering är bara fördelaktigt för stora tabeller med regelbundet åtkomlig information. Till exempel, för att fortsätta med vår läroboksanalogi, är det inte meningsfullt att indexera en sagobok för barn med bara ett dussin sidor. Det är mer effektivt att helt enkelt läsa boken för att hitta varje förekomst av ordet "sköldpadda" än det skulle vara att ställa in och underhålla index, söka efter dessa index och sedan granska varje sida som tillhandahålls. I datorvärlden representerar de extra uppgifterna kring indexering bortkastade resurser som skulle vara bättre ändamålsenliga genom att inte indexera.
Utan index, när tabeller växer till enorma proportioner, lider svarstiderna av frågor som riktar sig till dessa trubbiga tabeller. Ineffektiva frågor visar sig i latens inom applikations- eller webbplatsprestanda. Vi identifierar vanligtvis denna latens genom att använda MySQL-funktionen för långsam frågelogg. Du kan hitta mer information om hur du använder funktionen för långsam frågelogg i den första artikeln i den här serien:MySQL Performance:Identifying Long Queries.
När en kolossal tabell når sin vändpunkt når den potentialen för driftstopp för applikationer och webbplatser . Genom att utföra rutinmässiga utvärderingar för att växa databasen etableras optimal databasprestanda och kringgår långa frågors inneboende avbrott.
MySQL-indexering För- och nackdelar
Det finns fördelar och nackdelar med att använda MySQL-indexering, och vi kommer att diskutera de betydande för- och nackdelarna för dig. Dessa aspekter hjälper dig att bestämma om indexering är ett lämpligt val för din situation.
Vilken information indexerar One?
Att välja vad som ska indexeras är förmodligen den mest utmanande delen för att indexera dina databaser. Att avgöra vad som är viktigt nog att indexera och vad som är tillräckligt godartat för att inte indexera. Generellt sett fungerar indexering bäst på de kolumner som är föremål för WHERE-satserna i dina vanliga frågor. Tänk på följande förenklade tabell:
ID, TITLE, LAST_NAME, FIRST_NAME, MAIDEN_NAME, DOB, GENDER, AGE, DESCRIPTION, HISTORY, ETC...
Om dina frågor förlitar sig på att testa WHERE-satsen med LAST_NAME och FIRST_NAME skulle indexering efter dessa två kolumner avsevärt öka frågans svarstid. Alternativt, om dina frågor förlitar sig på en enkel ID-sökning, skulle indexering efter ID vara det bättre valet.
Dessa exempel är bara ett rudimentärt exempel, och det finns flera typer av indexeringsstrukturer inbyggda i MySQL. Följande MySQL-sida diskuterar dessa typer av index mer i detalj, och en rekommenderad läsning för alla som överväger att indexera:Hur MySQL använder index
Vad är ett unikt index?
En annan punkt att överväga när du utvärderar vilka kolumner som ska fungera som nyckeln i ditt index är om du ska använda begränsningen UNIQUE. Om du ställer in UNIQUE-begränsningen framtvingas unikhet baserat på den konfigurerade indexeringsnyckeln. Som med vilken nyckel som helst kan detta vara en enstaka kolumn eller en sammanlänkning av flera kolumner. Funktionen för denna begränsning säkerställer att det inte finns några dubbletter av poster i tabellen baserat på den konfigurerade nyckeln.
Vad är ett primärt nyckelindex?
Lika vanligt som den UNIKA begränsningen används PRIMARY KEY för att optimera index. Denna begränsning säkerställer att den angivna PRIMÄRNYCKELn inte kan ha ett nollvärde. Som ett resultat uppstår en prestandaökning när den körs på en InnoDB-lagringsmotor för tabellen i fråga. Denna ökning beror på hur InnoDB fysiskt lagrar data och placerar rader med nollvärde i nyckeln utanför en sammanhängande sekvens med rader som har värden. Genom att aktivera denna begränsning säkerställs att raderna i tabellen hålls i sammanhängande ordning för snabbare svar.
Hantera index
Nu kommer vi att täcka några av grunderna för att manipulera index med MySQL-syntax. I exempel kommer vi att inkludera skapande, radering och listning av index. Tänk på att dessa exempel har platshållarposter för de specifika sökorden. Dessa nyckelord är självförklarande till sin natur för enkel läsning, och nedan är en översikt över dem.
Lista/visa index
Tabeller kan ha flera index. Att hantera index kommer oundvikligen att kräva att man kan lista de befintliga indexen i en tabell. Syntaxen för att visa ett index är nedan.
SHOW INDEX FROM tableName;
Skapa index
Indexskapande har en enkel syntax. Svårigheten är att avgöra vilka kolumner som behöver indexeras och om det är nödvändigt att upprätthålla unikhet. Nedan kommer vi att illustrera hur man skapar index med och utan en PRIMÄRNYCKEL och UNIKA begränsningar.
Som tidigare nämnts kan tabeller ha flera index. Multipelindexering är användbart för att skapa index som är anpassade till de frågor som krävs av din applikation eller webbplats. Standardinställningarna tillåter upp till 16 index per tabell, öka detta antal men är i allmänhet fler än nödvändigt. Index kan skapas när en tabell skapas eller läggas till i tabellen som ytterligare index senare. Vi kommer att gå igenom båda metoderna nedan.
Exempel:Skapa en tabell med ett standardindex
CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
INDEX ( ID )
);
Exempel:Skapa en tabell med unikt index och primärnyckel
CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
PRIMARY KEY (ID),
UNIQUE INDEX ( ID )
);
Exempel:Lägg till ett index i befintlig tabell
CREATE INDEX indexName ON tableName (ID, LName, FName, LOC);
Exempel:Lägg till ett index i befintlig tabell med primärnyckel
CREATE UNIQUE INDEX indexName ON tableName (ID, LName, FName, LOC);
Ta bort index
När du hanterar index kan du tycka att det är nödvändigt att ta bort några. Att ta bort index är också en mycket enkel process, se exemplet nedan:
DROP INDEX indexName ON tableName;
Det finns många sätt att optimera din databas för verklig effektivitet. Om du vill lära dig mer eller konvertera sökmotortyperna som finns tillgängliga i MySQL läs igenom vår MyISAM vs. InnoDB handledning. Eller om du behöver välfungerande databaser, kolla in vår MySQL-produktsida för att se olika alternativ.