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:
- Přihlaste se ke svému účtu pomocí SSH.
- 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
- Na výzvu Zadejte heslo zadejte heslo. Zobrazí se výzva mysql>.
-
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. -
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:
- Přihlaste se ke svému účtu pomocí SSH.
- 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
- Na výzvu Zadejte heslo zadejte heslo. Zobrazí se výzva mysql>.
-
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. -
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;
-
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.