Výkon dotazů profilu na flexibilním serveru Azure Database for MySQL pomocí funkce EXPLAIN

PLATÍ PRO: Flexibilní server Azure Database for MySQL – Jednoúčelový server Azure Database for MySQL

Důležité

Jednoúčelový server Azure Database for MySQL je na cestě vyřazení. Důrazně doporučujeme upgradovat na flexibilní server Azure Database for MySQL. Další informace o migraci na flexibilní server Azure Database for MySQL najdete v tématu Co se děje s jednoúčelovým serverem Azure Database for MySQL?

EXPLAIN je užitečný nástroj, který vám pomůže optimalizovat dotazy. Příkaz EXPLAIN můžete použít k získání informací o tom, jak se spouští příkazy SQL. Následující příklad ukazuje výstup spuštění příkazu EXPLAIN.

mysql> EXPLAIN SELECT * FROM tb1 WHERE id=100\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 10.00
        Extra: Using where

V tomto příkladu je hodnota klíče NULL, což znamená, že flexibilní server Azure Database for MySQL nemůže najít žádné indexy optimalizované pro dotaz. V důsledku toho provede úplnou kontrolu tabulky. Pojďme tento dotaz optimalizovat přidáním indexu do sloupce ID a opětovným spuštěním příkazu EXPLAIN.

mysql> ALTER TABLE tb1 ADD KEY (id);
mysql> EXPLAIN SELECT * FROM tb1 WHERE id=100\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ref
possible_keys: id
          key: id
      key_len: 4
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL

Výstup teď ukazuje, že flexibilní server Azure Database for MySQL používá index k omezení počtu řádků na 1, což výrazně zkracuje dobu hledání.

Pokrytí indexu

Krytý index zahrnuje všechny sloupce dotazu, což snižuje načítání hodnot z datových tabulek. To ilustruje následující příkaz GROUP BY a související výstup.

mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using temporary; Using filesort

Výstup ukazuje, že flexibilní server Azure Database for MySQL nepoužívá žádné indexy, protože správné indexy nejsou k dispozici. Výstup také ukazuje použití dočasného; Pomocí souboru, který indikuje, že flexibilní server Azure Database for MySQL vytvoří dočasnou tabulku pro splnění klauzule GROUP BY .

Vytvoření indexu pouze ve sloupci c2 nijak nemění a flexibilní server Azure Database for MySQL stále potřebuje vytvořit dočasnou tabulku:

mysql> ALTER TABLE tb1 ADD KEY (c2);
mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using temporary; Using filesort

V tomto případě můžete vytvořit zahrnutý index na c1 i c2 přidáním hodnoty c2 přímo do indexu, což eliminuje další vyhledávání dat.

mysql> ALTER TABLE tb1 ADD KEY covered(c1,c2);
mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: index
possible_keys: covered
          key: covered
      key_len: 108
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using index

Jak ukazuje výstup výše uvedeného příkazu EXPLAIN, flexibilní server Azure Database for MySQL teď používá pokrytý index a nemusíte vytvářet dočasnou tabulku.

Kombinovaný index

Kombinovaný index se skládá z hodnot z více sloupců a lze ho považovat za matici řádků seřazených zřetězením hodnot indexovaných sloupců. Tato metoda může být užitečná v příkazu GROUP BY .

mysql> EXPLAIN SELECT c1, c2 from tb1 WHERE c2 LIKE '%100' ORDER BY c1 DESC LIMIT 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using filesort

Flexibilní server Azure Database for MySQL provádí operaci řazení souborů, která je poměrně pomalá, zejména v případě, že musí seřadit mnoho řádků. Pokud chcete tento dotaz optimalizovat, vytvořte kombinovaný index pro oba sloupce, které jsou seřazené.

mysql> ALTER TABLE tb1 ADD KEY my_sort2 (c1, c2);
mysql> EXPLAIN SELECT c1, c2 from tb1 WHERE c2 LIKE '%100' ORDER BY c1 DESC LIMIT 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: index
possible_keys: NULL
          key: my_sort2
      key_len: 108
          ref: NULL
         rows: 10
     filtered: 11.11
        Extra: Using where; Using index

Výstup příkazu EXPLAIN teď ukazuje, že flexibilní server Azure Database for MySQL používá kombinovaný index, aby se zabránilo dalšímu řazení, protože index je už seřazený.

Závěr

Výkon můžete výrazně zvýšit pomocí funkce EXPLAIN společně s různými typy indexů. Index v tabulce nemusí nutně znamenat, že flexibilní server Azure Database for MySQL ho může použít pro vaše dotazy. Vždy ověřte své předpoklady pomocí funkce EXPLAIN a optimalizujte dotazy pomocí indexů.

Další kroky

  • Pokud chcete najít partnerské odpovědi na nejdůležitější otázky nebo publikovat nebo odpovědět na otázku, navštivte web Stack Overflow.