Profil lekérdezési teljesítménye az Azure Database for MySQL-ben – Rugalmas kiszolgáló a EXPLAIN használatával
A következőkre vonatkozik: Azure Database for MySQL – Egykiszolgálós Azure Database for MySQL – Rugalmas kiszolgáló
Fontos
Az önálló Azure Database for MySQL-kiszolgáló a kivonási útvonalon van. Határozottan javasoljuk, hogy frissítsen rugalmas Azure Database for MySQL-kiszolgálóra. További információ a rugalmas Azure Database for MySQL-kiszolgálóra való migrálásról: Mi történik az önálló Azure Database for MySQL-kiszolgálóval?
A EXPLAIN egy hasznos eszköz, amely segíthet a lekérdezések optimalizálásában. Az SQL-utasítások futtatásáról a EXPLAIN utasítással tájékozódhat. Az alábbiakban egy EXPLAIN utasítás futtatásából származó példakimenet látható.
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
Ebben a példában a kulcs értéke NULL, ami azt jelenti, hogy a rugalmas Azure Database for MySQL-kiszolgáló nem talál a lekérdezéshez optimalizált indexeket. Ennek eredményeként teljes táblázatvizsgálatot végez. Optimalizáljuk ezt a lekérdezést úgy, hogy hozzáadunk egy indexet az azonosító oszlophoz, majd futtassuk újra a EXPLAIN utasítást.
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
A kimenet azt mutatja, hogy a rugalmas Azure Database for MySQL-kiszolgáló egy index használatával korlátozza a sorok számát 1-re, ami jelentősen lerövidíti a keresési időt.
Index lefedése
A lefedő index tartalmazza a lekérdezés összes oszlopát, ami csökkenti az adattáblákból való értéklekérést. Ezt az alábbi GROUP BY utasítás és a kapcsolódó kimenet szemlélteti.
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
A kimenet azt mutatja, hogy a rugalmas Azure Database for MySQL-kiszolgáló nem használ indexeket, mert a megfelelő indexek nem érhetők el. A kimenet az Ideiglenes használatot is megjeleníti ; A Filesort használata, amely azt jelzi, hogy a rugalmas Azure Database for MySQL-kiszolgáló létrehoz egy ideiglenes táblát a GROUP BY záradék teljesítéséhez.
Ha csak a c2 oszlopon hoz létre indexet, nem számít, és a rugalmas Azure Database for MySQL-kiszolgálónak továbbra is létre kell hoznia egy ideiglenes táblát:
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
Ebben az esetben a c1 és a c2 indexen is létrehozhat fedett indexet úgy, hogy közvetlenül az indexben hozzáadja a c2" értéket, ami megszünteti a további adatkeresést.
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
Ahogy a fenti MAGYARÁZAT kimenete is mutatja, a rugalmas Azure Database for MySQL-kiszolgáló most már a lefedett indexet használja, és nem kell ideiglenes táblát létrehoznia.
Kombinált index
Az összevont indexek több oszlop értékeiből állnak, és sortömbnek tekinthetők, amelyek az indexelt oszlopok értékeinek összefűzésével vannak rendezve. Ez a módszer a GROUP BY utasításban lehet hasznos.
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
A rugalmas Azure Database for MySQL-kiszolgáló meglehetősen lassú fájlrendező műveletet hajt végre, különösen akkor, ha sok sort kell rendeznie. A lekérdezés optimalizálásához hozzon létre egy kombinált indexet a rendezés alatt álló mindkét oszlopon.
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
A EXPLAIN utasítás kimenete azt mutatja, hogy a rugalmas Azure Database for MySQL-kiszolgáló kombinált indexet használ a további rendezés elkerülése érdekében, mivel az index már rendezve van.
Összefoglalás
A teljesítmény jelentősen növelhető a EXPLAIN és a különböző típusú indexek használatával. Ha index van egy táblán, az nem feltétlenül jelenti azt, hogy a rugalmas Azure Database for MySQL-kiszolgáló használhatja a lekérdezésekhez. Mindig ellenőrizze a feltételezéseket a EXPLAIN használatával, és optimalizálja a lekérdezéseket indexekkel.
További lépések
- Ha társválaszt szeretne keresni a legfontosabb kérdésekre, vagy fel szeretne tenni vagy megválaszolni egy kérdést, látogasson el a Stack Overflow webhelyre.