sql >> Databáze >  >> RDS >> Mysql

Jak používat indexy ke zlepšení výkonu dotazů MySQL

Tento článek pojednává o indexech a o tom, jak je můžete použít ke zlepšení výkonu databázových dotazů MySQL.

Výkon a indexy databáze

Databázové indexy v MySQL umožňují urychlit výkon SELECT dotazovací příkazy. U malých tabulek index moc nepomůže. Pokud však máte tabulky s velkým množstvím dat, indexy mohou výrazně zlepšit výkon.

Následující chování naznačuje, že přidání indexů může být přínosem pro tabulky:

  • Vaše stránky se načítají velmi pomalu nebo vůbec.
  • Aplikace se nemůže připojit ke své databázi.
  • Databázové dotazy jsou zálohovány.

Pokud se setkáte s některým z těchto problémů, měli byste analyzovat databázové dotazy a zvážit přidání indexů.

Pokud máte spravovaný VPS nebo spravovaný dedikovaný server, může kromě přidávání indexů pomoci i větší velikost vyrovnávací paměti pro řazení. Otevřete prosím tiket na zákaznickém portálu na https://my.a2hosting.com a proberte tuto možnost s naším Guru Crew.

Analýza databázových dotazů

Chcete-li určit, které tabulky mohou mít prospěch z použití indexů, musíte analyzovat databázové dotazy. EXPLAIN SELECT prohlášení vám to pomůže. Chcete-li analyzovat databázové dotazy, postupujte takto:

  1. Přihlaste se ke svému účtu pomocí SSH.
  2. Na příkazovém řádku zadejte následující příkaz a nahraďte uživatelské jméno s vaším uživatelským jménem účtu A2 Hosting a databází s názvem databáze:
    mysql -u username -p database
  3. Na výzvu Zadejte heslo zadejte heslo. Zobrazí se výzva mysql>.
  4. Zadejte následující příkaz SQL:

    EXPLAIN SELECT * FROM table_name WHERE conditions \G
    
    Pokud napíšete svůj vlastní kód aplikace, pak již znáte SELECT příkazy, které používáte k načítání dat. Pokud používáte aplikaci třetí strany, jako je WordPress nebo PrestaShop, možná budete muset prozkoumat zdrojový kód nebo protokoly databáze, abyste přesně určili VYBRAT příkazy, které se používají k načítání dat.
  5. Výstup z EXPLAIN SELECT ukazuje, jak optimalizátor dotazů MySQL provede dotaz. Zvažte například následující výstup:

    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)
    

    V tomto příkladu výstup:

    • možné_klíče a klíč obě hodnoty jsou NULL , což znamená, že MySQL nemá index, který by mohl použít pro tento dotaz.
    • řádky hodnota znamená, že MySQL bude číst 142 řádků pro tento dotaz. Pokud je v tabulce celkem 142 řádků, znamená to, že MySQL musí pro vygenerování sady výsledků prozkoumat každý řádek. U velkého stolu to může nějakou dobu trvat.

    Na druhou stranu, pokud bychom měli vytvořit index s názvem index_name pro příjmení může MySQL vygenerovat následující výstup pro stejný dotaz:

    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)
    

    Jak vidíte, možné_klíče a klíč hodnoty indikují, že MySQL nalezlo index, který může použít k optimalizaci dotazu. Kromě toho bude MySQL číst pouze 17 řádků pro generování sady výsledků namísto všech 142 řádků. (To znamená, že tabulka má 17 řádků, kde příjmení začíná na „T“.) Nakonec Extra hodnota také označuje, že MySQL použije pro dotaz index.

Přidávání, odebírání a zobrazování indexů v tabulce

Poté, co analyzujete databázové dotazy a určíte, kde jsou úzká místa výkonu, jste připraveni přidat indexy. Chcete-li to provést, postupujte takto:

  1. Přihlaste se ke svému účtu pomocí SSH.
  2. Na příkazovém řádku zadejte následující příkaz a nahraďte uživatelské jméno s vaším uživatelským jménem účtu A2 Hosting a databází s názvem databáze:
    mysql -u username -p database
  3. Na výzvu Zadejte heslo zadejte heslo. Zobrazí se výzva mysql>.
  4. Chcete-li přidat index do tabulky, zadejte následující příkaz SQL. Nahraďte název_tabulky s názvem tabulky index_name s názvem nového indexu (což může být cokoliv, co chcete) a sloupec_tabulky s názvem sloupce tabulky, pro který chcete přidat index:

    ALTER TABLE table_name ADD INDEX index_name (table_column);
    
    Přestože indexy mohou zlepšit výkon, mohou také negativně ovlivnit výkon, pokud jich je příliš mnoho. Je tomu tak proto, že čím více indexů tabulka má, tím více práce musí MySQL vykonat, aby je udržovala aktuální. Trik spočívá v nalezení správné rovnováhy mezi dostatečným množstvím indexů ke zlepšení výkonu, ale ne tolika, aby negativně ovlivnily výkon.
  5. Chcete-li odebrat index z tabulky, zadejte následující příkaz SQL. Nahraďte název_tabulky s názvem tabulky a nahraďte index_name s názvem indexu, který chcete smazat:

    ALTER TABLE table_name DROP INDEX index_name;
    
  6. Chcete-li zobrazit všechny indexy pro tabulku, zadejte následující příkaz SQL. Nahraďte název_tabulky s názvem tabulky:

    SHOW INDEX FROM table_name \G
    
    Po vytvoření indexu byste měli použít EXPLAIN SELECT znovu, abyste viděli, jak jsou dotazy ovlivněny. Kromě toho byste měli pokračovat ve sledování výkonu databáze, abyste zjistili, zda došlo ke zlepšení. Možná budete muset provést řadu testů, abyste našli optimální počet indexů pro vaši databázi.

Další informace

  • Další informace o optimalizaci a indexech MySQL naleznete na adrese https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html.
  • Další informace o EXPLAIN prohlášení, navštivte prosím https://dev.mysql.com/doc/refman/5.5/en/explain.html.

  1. Jak mohu vložit objekt JSON do Postgres pomocí Java PrepareStatement?

  2. Jak vytvořit databázi ze skriptu v MySQL

  3. Chyba soketu Postgresql na OSX 10.7.3 při spuštění Django's syncdb

  4. Jak získat seznam tabulek bez omezení primárního klíče ve všech databázích instance SQL Server - SQL Server / TSQL výukový program, část 62