Udostępnij za pośrednictwem


Wydajność zapytań profilu w usłudze Azure Database for MySQL — serwer elastyczny przy użyciu funkcji WYJAŚNIJ

DOTYCZY: Azure Database for MySQL — pojedynczy serwer usługi Azure Database for MySQL — serwer elastyczny

Ważne

Pojedynczy serwer usługi Azure Database for MySQL znajduje się na ścieżce wycofania. Zdecydowanie zalecamy uaktualnienie do serwera elastycznego usługi Azure Database for MySQL. Aby uzyskać więcej informacji na temat migracji do serwera elastycznego usługi Azure Database for MySQL, zobacz Co się dzieje z usługą Azure Database for MySQL — pojedynczy serwer?

EXPLAIN to przydatne narzędzie, które ułatwia optymalizowanie zapytań. Aby uzyskać informacje na temat sposobu uruchamiania instrukcji SQL, możesz użyć instrukcji EXPLAIN. Poniżej przedstawiono przykładowe dane wyjściowe z uruchamiania instrukcji 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

W tym przykładzie wartość klucza ma wartość NULL, co oznacza, że serwer elastyczny usługi Azure Database for MySQL nie może zlokalizować żadnych indeksów zoptymalizowanych pod kątem zapytania. W rezultacie wykonuje pełne skanowanie tabeli. Zoptymalizujmy to zapytanie, dodając indeks w kolumnie ID , a następnie ponownie uruchomimy instrukcję 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

Teraz dane wyjściowe pokazują, że serwer elastyczny usługi Azure Database for MySQL używa indeksu, aby ograniczyć liczbę wierszy do 1, co znacznie skraca czas wyszukiwania.

Indeks obejmujący

Indeks obejmujący zawiera wszystkie kolumny zapytania, co zmniejsza pobieranie wartości z tabel danych. Poniższa instrukcja GROUP BY i powiązane dane wyjściowe ilustrują to.

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

Dane wyjściowe pokazują, że serwer elastyczny usługi Azure Database for MySQL nie używa żadnych indeksów, ponieważ odpowiednie indeksy są niedostępne. W danych wyjściowych jest również wyświetlany komunikat Using temporary (Korzystanie z funkcji tymczasowej); Przy użyciu programu filesort, który wskazuje, że serwer elastyczny usługi Azure Database for MySQL tworzy tymczasową tabelę spełniającą klauzulę GROUP BY .

Tworzenie indeksu tylko w kolumnie c2 nie ma różnicy, a serwer elastyczny usługi Azure Database for MySQL nadal musi utworzyć tabelę tymczasową:

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

W takim przypadku można utworzyć indeks objęty zarówno c1, jak i c2, dodając wartość c2" bezpośrednio w indeksie, co eliminuje dalsze wyszukiwanie danych.

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 wynika z powyższych danych wyjściowych funkcji WYJAŚNIj, serwer elastyczny usługi Azure Database for MySQL używa teraz indeksu objętego i nie wymaga tworzenia tabeli tymczasowej.

Indeks połączony

Połączony indeks składa się z wartości z wielu kolumn i może być uważany za tablicę wierszy, które są sortowane przez łączenie wartości indeksowanych kolumn. Ta metoda może być przydatna w instrukcji 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

Serwer elastyczny usługi Azure Database for MySQL wykonuje operację sortowania plików, która jest dość niska, zwłaszcza gdy trzeba sortować wiele wierszy. Aby zoptymalizować to zapytanie, utwórz połączony indeks dla obu kolumn, które są sortowane.

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

Dane wyjściowe instrukcji EXPLAIN pokazują teraz, że serwer elastyczny usługi Azure Database for MySQL używa połączonego indeksu, aby uniknąć dodatkowego sortowania, ponieważ indeks jest już posortowany.

Podsumowanie

Wydajność można znacznie zwiększyć, używając funkcji WYJAŚNIj razem z różnymi typami indeksów. Posiadanie indeksu w tabeli nie musi oznaczać, że elastyczny serwer usługi Azure Database for MySQL może używać go do zapytań. Zawsze zweryfikuj swoje założenia przy użyciu funkcji WYJAŚNIJ i zoptymalizuj zapytania przy użyciu indeksów.

Następne kroki

  • Aby znaleźć odpowiedzi na najważniejsze pytania lub opublikować lub odpowiedzieć na pytanie, odwiedź witrynę Stack Overflow.