sql >> Databasteknik >  >> RDS >> Mysql

Hur man använder index för att förbättra MySQL-frågeprestanda

Den här artikeln diskuterar index och hur du kan använda dem för att förbättra prestanda för MySQL-databasfrågor.

Databasprestanda och index

Databasindex i MySQL gör att du kan accelerera prestandan för SELECT frågesatser. För små tabeller hjälper ett index inte mycket. Men om du har tabeller med en stor mängd data kan index förbättra prestandan dramatiskt.

Följande beteenden är alla tecken på att tabeller kan dra nytta av att lägga till index:

  • Din webbplats laddas väldigt långsamt eller inte alls.
  • Ett program kan inte ansluta till sin databas.
  • Databasfrågor säkerhetskopieras.

Om du upplever något av dessa problem bör du analysera dina databasfrågor och överväga att lägga till index.

Om du har en hanterad VPS eller hanterad dedikerad server kan en ökad sorteringsbuffertstorlek också hjälpa till förutom att lägga till index. Öppna en biljett på kundportalen på https://my.a2hosting.com för att diskutera detta alternativ med vårt Guru-team.

Analysera databasfrågor

För att avgöra vilka tabeller som kan dra nytta av att använda index måste du analysera dina databasfrågor. EXPLAIN SELECT uttalande hjälper dig att göra detta. För att analysera databasfrågor, följ dessa steg:

  1. Logga in på ditt konto med SSH.
  2. Skriv följande kommando vid kommandotolken och ersätt användarnamn med ditt A2 Hosting-kontos användarnamn och databas med namnet på databasen:
    mysql -u username -p database
  3. Skriv ditt lösenord vid uppmaningen Enter Password. Mysql>-prompten visas.
  4. Skriv följande SQL-kommando:

    EXPLAIN SELECT * FROM table_name WHERE conditions \G
    
    Om du skriver din egen ansökningskod känner du redan till SELECT uttalanden du använder för att hämta data. Om du använder ett tredjepartsprogram, som WordPress eller PrestaShop, kan du behöva undersöka källkoden eller databasloggarna för att avgöra exakt SELECT satser som används för att hämta data.
  5. Utdata från EXPLAIN SELECT uttalande visar hur MySQL-frågeoptimeraren kommer att exekvera frågan. Tänk till exempel på följande utdata:

    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 detta exempel utdata:

    • De möjliga_nycklarna och tangenten värdena är båda NULL , vilket indikerar att MySQL inte har ett index som den kan använda för den här frågan.
    • raderna värdet indikerar att MySQL kommer att läsa 142 rader för denna fråga. Om det finns totalt 142 rader i tabellen betyder det att MySQL måste undersöka varje rad för att generera resultatuppsättningen. Detta kan ta ganska lång tid för ett stort bord.

    Å andra sidan, om vi skulle skapa ett index som heter index_name för efternamnet kolumnen, kan MySQL generera följande utdata för samma fråga:

    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 är möjliga_nycklarna och tangenten värden indikerar att MySQL har hittat ett index som den kan använda för att optimera frågan. Dessutom kommer MySQL endast att läsa 17 rader för att generera resultatuppsättningen, istället för alla 142 rader. (Detta betyder att tabellen har 17 rader där efternamnet börjar med "T".) Slutligen, Extra värde indikerar också att MySQL kommer att använda ett index för frågan.

Lägga till, ta bort och visa index i en tabell

När du har analyserat dina databasfrågor och bestämt var prestandaflaskhalsarna finns är du redo att lägga till index. För att göra detta, följ dessa steg:

  1. Logga in på ditt konto med SSH.
  2. Skriv följande kommando vid kommandotolken och ersätt användarnamn med ditt A2 Hosting-kontos användarnamn och databas med namnet på databasen:
    mysql -u username -p database
  3. Skriv ditt lösenord vid uppmaningen Enter Password. Mysql>-prompten visas.
  4. För att lägga till ett index i en tabell, skriv följande SQL-kommando. Ersätt tabellnamn med tabellens namn, index_name med namnet på det nya indexet (som kan vara vad du vill) och tabellkolumn med namnet på den tabellkolumn som du vill lägga till indexet för:

    ALTER TABLE table_name ADD INDEX index_name (table_column);
    
    Även om index kan förbättra prestanda, kan index också påverka prestandan negativt om det finns för många av dem. Detta beror på att ju fler index en tabell har, desto mer arbete måste MySQL göra för att hålla dem uppdaterade. Tricket är att hitta rätt balans mellan tillräckligt många index för att förbättra prestandan, men inte så många att de påverkar prestandan negativt.
  5. För att ta bort ett index från en tabell, skriv följande SQL-kommando. Ersätt tabellnamn med tabellens namn och ersätt index_name med namnet på indexet som du vill radera:

    ALTER TABLE table_name DROP INDEX index_name;
    
  6. För att visa alla index för en tabell, skriv följande SQL-kommando. Ersätt tabellnamn med tabellens namn:

    SHOW INDEX FROM table_name \G
    
    När du har skapat ett index bör du använda EXPLAIN SELECT uttalande igen för att se hur frågor påverkas. Dessutom bör du fortsätta att övervaka databasprestanda för att se om det finns förbättringar. Du kan behöva köra en serie tester för att hitta det optimala antalet index för din databas.

Mer information

  • För mer information om MySQL-optimering och index, besök https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html.
  • För mer information om EXPLAIN uttalande, besök https://dev.mysql.com/doc/refman/5.5/en/explain.html.

  1. Web2py – Migrera från SQLite till MySQL

  2. SQL Server variabel kolumner namn?

  3. Kan vi använda trådning i PL/SQL?

  4. Tabelluppslagningar i SortCL-kompatibla IRI-jobb