sql >> Databasteknik >  >> RDS >> Mysql

MySQL-prestanda:MySQL/MariaDB-index

Data i en MySQL/MariaDB-databas lagras i tabeller. Ett enkelt sätt att tänka på index är att föreställa sig ett omfattande kalkylblad. Denna typ av system är inte alltid gynnsam för snabb sökning; det är där ett index blir viktigt. Om det inte finns något index måste databasmotorn starta på rad ett och bläddra igenom alla rader och leta efter motsvarande värden. Om det här är ett litet bord så är det ingen stor sak, men i större tabeller och applikationer där det kan finnas tabeller med miljoner och till och med miljarder rader blir det problematiskt. Som du kan föreställa dig kommer att söka igenom dessa rader en efter en vara tidskrävande, även på den senaste hårdvaran. Lösningen är att skapa ett INDEX (eller fler än ett) för dina data.

Vad är ett index?

Ett index är en organiserad uppslagstabell som innehåller pekare till var data kan hämtas i databasen. Detta koncept liknar bokindex. I en bok listar indexet sidnummer där olika ämnen finns. I en databas lagrar indexet pekare som är i en logisk och sorterad ordning, vilket möjliggör snabba uppslagningar i databasen. Föreställ dig en bok utan register. Om du vill leta upp information om ett specifikt ämne måste du börja från början och bläddra igenom sidorna tills du hittar den information du letar efter. Ett bokregister löser detta genom att berätta exakt vilka sidor informationen du letar efter är. Detta är i huvudsak hur ett MySQL-index fungerar.

När använder MySQL index?

När som helst databasservern måste slå upp information kommer den att använda ett index för att påskynda processen. Exempel på detta inkluderar satserna WHERE, JOIN ON, MIN/MAX och ORDER BY/GROUP BY. Om dina frågor ofta ska söka eller matcha en kolumn i någon av dessa situationer bör du överväga att skapa ett index.

Förbättrar index databasprestanda?

För det mesta är det korta svaret ja. För läsningar och sökningar genom data ökar index absolut prestandan. Att inte göra genomsökningar av hela tabeller kommer att förbättra nästan vilken SELECT-fråga som helst. Detta kommer till ett litet pris. För kolumner som ofta manipuleras tillkommer en kostnad för varje förändring. Detta kan försämra INSERT och UPPDATERINGAR i databasen.

Vanliga MySQL-indextyper

Det finns tre vanliga typer av MySQL-index:

  • Primär nyckel
  • Index
  • Unik

PRIMÄRNYCKEL

En primärnyckel talar om för databasservern vilken som är den eller de mest avgörande kolumnerna i tabellen. Vanligtvis används detta för auto_increment id-kolumner. Om du till exempel har en tabell som innehåller personalinformation, skulle du vilja ha en primärnyckel i kolumnen "EMPLOYEE_ID". I andra tabeller, det vill säga en lönetabell, skulle du helt enkelt hänvisa till EMPLOYEE_ID istället för alla anställdas data.

INDEX

En standard INDEX används för att tala om för databasservern att en eller flera av kolumnerna i tabellen kommer att genomsökas mycket, och därför bör ett index skapas på dem. Detta kan byggas under tabellskapandet eller om du upptäcker att du behöver ett index på en kolumn senare, kan det läggas till då.

UNIKT

Ett UNIKT index är lite distinkt genom att det sätter specifika begränsningar för vad som kan skrivas in i tabellen. Om du försöker infoga en rad som innehåller ett värde som redan är inkluderat i data, kommer INSERT att ge ett fel. Detta möjliggör snabba sökningar samt viss dataintegritet.

Hur man skapar ett index

Det finns flera sätt att skapa ett index på en kolumn. Du kan ställa in ett index när du CREATE TABLE, eller efteråt med antingen ALTER TABLE- eller CREATE INDEX-satserna.

Skapa ett PRIMÄRNYCKELindex

Det enklaste sättet att skapa ett PRIMARY KEY-index är att göra det när du skapar tabellen. Vi kommer att använda ett exempel på en anställd tabell för denna handledning. Tabellen kommer att ha tre kolumner:ID, FIRSTNAME och LASTNAME. Skapa kan se ut ungefär så här:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32)
);

Denna sats kommer att skapa tabellen utan ett index. Vi kan lägga till primärnyckeln med en sats så här:

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT PRIMARY KEY (ID);

Detta talar om för MySQL att vi har en primärnyckel på kolumn-ID.

Ett enklare sätt att göra detta är under skapandet av tabellen. Börjar om, vi kommer att återskapa tabellen och lägga till primärnyckeln i en sats.

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Denna enstaka sats utför samma uppgifter som de två första satserna ovan. En primärnyckel kan innehålla mer än en kolumn, men alla kolumner måste vara unika. Primärnyckeln kan användas för att identifiera en enskild rad i tabellen.

Skapa ett index med CREATE INDEX

Med hjälp av exempeltabellen ovan, föreställ dig att företaget har tusentals anställda och att du snabbt vill kunna söka de anställda på efternamn. Med en primärnyckel kan det bara finnas en post. Du kan inte ha flera personer som har samma anställd-ID. Med efternamn är det ganska vanligt att flera personer delar det namnet. Återigen, det finns några sätt att göra detta. Använd tabellen ovan:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Vi kan lägga till ett index i kolumnen LASTNAME så här:

CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);

Sökningar av LASTNAME blir nu snabbare i den här tabellen. I det här exemplet är "idx1" namnet på indexet. Detta kommer att göra det lättare att referera till själva indexet i framtiden om vi behöver.

Ett annat sätt att lägga till ett index i en tabell är med kommandot ALTER TABLE. För att åstadkomma samma sak som vi gjorde med föregående uttalande, kör vi följande kommando:

ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);

Det sista sättet att lägga till ett index som skulle spara lite tid är att göra det under CREATE TABLE. Om du i förväg vet att du kommer att söka eller gå med i en specifik kolumn kan du skapa den initiala tabellen med indexet redan där:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx1 (LASTNAME)
);

Alla dessa tre påståenden skapar samma resultat.

Index med flera kolumner

Ett index behöver inte bara finnas på en enda kolumn. Om vi ​​vill ha snabbare sökningar på både FIRSTNAME och LASTNAME kan vi skapa ett index på båda kolumnerna. I tabellen skapa skulle det se ut så här:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx2 (LASTNAME,FIRSTNAME)
);

Använd kommandot CREATE INDEX:

CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);

Och slutligen, kommandot ALTER TABLE:

ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);

Skapa ETT UNIKT INDEX

Det kan finnas tillfällen då du vill skapa ett index på en kolumn och även tvinga alla poster i den kolumnen att vara unika. Om vi ​​utökade vår exempeltabell till att inkludera en KONTORskolumn (som anger vilket kontor i byggnaden de har), så kanske vi vill göra detta till ett UNIKT index. Låt oss arbeta med den här tabellen:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  OFFICE INT,
  PRIMARY KEY (ID)
);

Lägg märke till att nu har vi ett heltal lagrat i tabellen för att ange vilket kontor personen har. Detta kan syfta på en annan tabell, "KONTOR", som kommer att innehålla information om olika kontor i byggnaden.

För att skapa ett index på detta, skulle vi utfärda följande kommando:

CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);

Du kan använda liknande kommandon för att skapa dessa i kommandona CREATE TABLE och ALTER TABLE. Om du nu försökte köra dessa två inlägg:

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);

Du skulle få ett felmeddelande på den andra INSERT:

Duplicate entry '1' for key 'idx3'

Ta bort ett index

Det kan komma en tid när du inte längre vill ha ett index på en kolumn. Du kanske insåg att du inte söker i en kolumn så ofta, och indexet saktar ner insättningar och uppdateringar. För att göra detta använder vi kommandot DROP INDEX. Vårt bord skapades så här:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR,
  LASTNAME CHAR,
  PRIMARY KEY (ID),
  INDEX idx (LASTNAME,FIRSTNAME)
);

Om vi ​​vill ta bort indexet på kolumnerna LASTNAME och FIRSTNAME, kommer vi att utfärda detta kommando:

DROP INDEX IDX ON EMPLOYEE;

Slutsats

Databasindex är ett grundläggande verktyg som optimerar hastigheten för datahämtning inom en struktur som drar fördel av sök- och läsprestanda i en tabell. Indexförbättring drivs i första hand till bekostnad av mer skriv- och/eller lagringsutrymme för att upprätthålla en optimal indexdatastruktur.

MySQL- och MariaDB-databaser erbjuder flera andra sökningar och läsalternativ, inklusive många som inte täcktes här. Viktiga takeaways här inkluderar: 

  • Se till att du tar dig tid att planera dina bord i förväg.
  • Om du inte planerar i förväg när du skapar tabellerna, utvärdera de kolumner som det söks mest på och skapa ett index för dem.

Se det i praktiken!

Vårt breda utbud av dedikerade servrar ger kraften, stabiliteten och säkerheten som behövs för att vara värd för den minsta databasen för växande företag upp till en högtillgänglighet, klustrade servrar för de största företagen. Vill du se vilka lösningar vi kan erbjuda för att möta dina behov?

Ring oss på 800.580.4985, eller öppna en chatt eller en biljett med oss ​​för att prata med en av våra kunniga lösningar eller erfarna värdrådgivare för att lära dig hur du kan dra nytta av denna teknik idag!

Serienavigering<>

  1. Prestandaöverväganden för temporär data i Oracle

  2. Installera MySQL på Ubuntu utan en lösenordsuppmaning

  3. Topp 10 bästa praxis i MySQL

  4. Att analysera döden med tusen minskar arbetsbelastningen