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.