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.