sql >> Database teknologi >  >> RDS >> Mysql

Sådan bruger du indekser til at forbedre MySQL-forespørgselsydeevnen

Denne artikel diskuterer indekser, og hvordan du kan bruge dem til at forbedre ydeevnen for MySQL-databaseforespørgsler.

Databaseydelse og indekser

Databaseindekser i MySQL giver dig mulighed for at accelerere ydeevnen af ​​SELECT forespørgselsudsagn. For små tabeller hjælper et indeks ikke meget. Men hvis du har tabeller med en stor mængde data, kan indekser forbedre ydeevnen dramatisk.

Følgende adfærd er alt sammen indikationer på, at tabeller kan drage fordel af at tilføje indekser:

  • Dit websted indlæses meget langsomt eller slet ikke.
  • Et program kan ikke oprette forbindelse til sin database.
  • Databaseforespørgsler er sikkerhedskopieret.

Hvis du oplever nogen af ​​disse problemer, bør du analysere dine databaseforespørgsler og overveje at tilføje indekser.

Hvis du har en administreret VPS eller en administreret dedikeret server, kan en øget sorteringsbufferstørrelse også hjælpe udover at tilføje indekser. Åbn venligst en billet på kundeportalen på https://my.a2hosting.com for at diskutere denne mulighed med vores Guru Crew.

Analyse af databaseforespørgsler

For at afgøre, hvilke tabeller der kan drage fordel af at bruge indekser, skal du analysere dine databaseforespørgsler. EXPLAIN SELECT erklæring hjælper dig med at gøre dette. Følg disse trin for at analysere databaseforespørgsler:

  1. Log ind på din konto ved hjælp af SSH.
  2. Ved kommandoprompten skal du skrive følgende kommando og erstatte brugernavn med dit A2 Hosting-konto brugernavn og database med navnet på databasen:
    mysql -u username -p database
  3. Ved prompten Indtast adgangskode skal du indtaste din adgangskode. mysql>-prompten vises.
  4. Indtast følgende SQL-kommando:

    EXPLAIN SELECT * FROM table_name WHERE conditions \G
    
    Hvis du skriver din egen ansøgningskode, kender du allerede SELECT udsagn du bruger til at hente data. Hvis du bruger et tredjepartsprogram, såsom WordPress eller PrestaShop, skal du muligvis undersøge kildekoden eller databaselogfilerne for at bestemme den nøjagtige SELECT udsagn, der bruges til at hente data.
  5. Output fra EXPLAIN SELECT sætning viser, hvordan MySQL-forespørgselsoptimeringsværktøjet vil udføre forespørgslen. Overvej for eksempel følgende output:

    mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: employees
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 142
            Extra: Using where
    1 row in set (0.00 sec)
    

    I dette eksempel output:

    • De mulige_nøgler og tast værdier er begge NULL , hvilket indikerer, at MySQL ikke har et indeks, den kan bruge til denne forespørgsel.
    • rækkerne værdi angiver, at MySQL vil læse 142 rækker for denne forespørgsel. Hvis der er 142 rækker i alt i tabellen, betyder det, at MySQL skal undersøge hver række for at generere resultatsættet. Dette kan tage ret lang tid for et stort bord.

    På den anden side, hvis vi skulle lave et indeks kaldet indeksnavn for efternavnet kolonne, genererer MySQL muligvis følgende output for den samme forespørgsel:

    mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: employees
             type: range
    possible_keys: index_name
              key: index_name
          key_len: 22
              ref: NULL
             rows: 17
            Extra: Using where; Using index
    1 row in set (0.00 sec)
    

    Som du kan se, er possible_keys og tast værdier indikerer, at MySQL har fundet et indeks, den kan bruge til at optimere forespørgslen. Derudover vil MySQL kun læse 17 rækker for at generere resultatsættet i stedet for alle 142 rækker. (Det betyder, at tabellen har 17 rækker, hvor efternavnet begynder med "T".) Til sidst, Ekstra værdi angiver også, at MySQL vil bruge et indeks til forespørgslen.

Tilføjelse, fjernelse og visning af indekser i en tabel

Når du har analyseret dine databaseforespørgsler og afgjort, hvor ydeevneflaskehalsene er, er du klar til at tilføje indekser. For at gøre dette skal du følge disse trin:

  1. Log ind på din konto ved hjælp af SSH.
  2. Ved kommandoprompten skal du skrive følgende kommando og erstatte brugernavn med dit A2 Hosting-konto brugernavn og database med navnet på databasen:
    mysql -u username -p database
  3. Ved prompten Indtast adgangskode skal du indtaste din adgangskode. mysql>-prompten vises.
  4. For at tilføje et indeks til en tabel skal du skrive følgende SQL-kommando. Erstat tabelnavn med navnet på tabellen, indeksnavn med navnet på det nye indeks (som kan være alt, hvad du vil) og tabel_kolonne med navnet på den tabelkolonne, som du vil tilføje indekset for:

    ALTER TABLE table_name ADD INDEX index_name (table_column);
    
    Selvom indekser kan forbedre ydeevnen, kan indekser også påvirke ydeevnen negativt, hvis der er for mange af dem. Dette skyldes, at jo flere indekser en tabel har, jo mere arbejde skal MySQL gøre for at holde dem opdateret. Tricket er at finde den rigtige balance mellem nok indekser til at forbedre ydeevnen, men ikke så mange, at de påvirker ydeevnen negativt.
  5. For at fjerne et indeks fra en tabel skal du skrive følgende SQL-kommando. Erstat tabelnavn med navnet på tabellen, og erstat indeksnavn med navnet på det indeks, du vil slette:

    ALTER TABLE table_name DROP INDEX index_name;
    
  6. For at se alle indekserne for en tabel skal du skrive følgende SQL-kommando. Erstat tabelnavn med tabellens navn:

    SHOW INDEX FROM table_name \G
    
    Når du har oprettet et indeks, skal du bruge EXPLAIN SELECT erklæring igen for at se, hvordan forespørgsler påvirkes. Derudover bør du fortsætte med at overvåge databasens ydeevne for at se, om der er forbedringer. Du skal muligvis køre en række tests for at finde det optimale antal indekser til din database.

Flere oplysninger

  • For mere information om MySQL-optimering og indekser, besøg venligst https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html.
  • For mere information om EXPLAIN erklæring, besøg venligst https://dev.mysql.com/doc/refman/5.5/en/explain.html.

  1. Hvordan kontrollerer man, om der findes en række i MySQL? (dvs. tjek om der findes en e-mail i MySQL)

  2. BatchUpdateException:Batchen afsluttes ikke

  3. Kan jeg få en plpgsql-funktion til at returnere et heltal uden at bruge en variabel?

  4. MySQL POW() Funktion – Hæv en værdi til kraften af ​​en anden værdi