Troubleshoot query performance in Azure Database for MySQL - Flexible Server

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 lekérdezési teljesítményt több tényező is befolyásolhatja, ezért először is fontos megvizsgálni a rugalmas Azure Database for MySQL-kiszolgálópéldányban tapasztalt tünetek hatókörét. A lekérdezési teljesítmény például lassú a következőhöz:

  • Az Azure Database for MySQL rugalmas kiszolgálópéldányán futó összes lekérdezés?
  • Egy adott lekérdezéskészlet?
  • Egy adott lekérdezés?

Ne feledje azt is, hogy a lekérdezett táblák szerkezetének vagy alapjául szolgáló adatoknak a legutóbbi változásai hatással lehetnek a teljesítményre.

Naplózási funkciók engedélyezése

Az egyes lekérdezések elemzése előtt meg kell határoznia a lekérdezési teljesítményteszteket. Ezekkel az információkkal az adatbázis-kiszolgálón naplózási funkciókat valósíthat meg az alkalmazás igényeinek megfelelően megadott küszöbértéket meghaladó lekérdezések nyomon követéséhez.

Rugalmas Azure Database for MySQL-kiszolgáló esetén ajánlott a lassú lekérdezésnapló-funkció használata az N másodpercnél hosszabb ideig futó lekérdezések azonosításához. Miután azonosította a lassú lekérdezési napló lekérdezéseit, a MySQL-diagnosztika segítségével elháríthatja ezeket a lekérdezéseket.

Mielőtt elkezdené nyomon követni a hosszú ideig futó lekérdezéseket, engedélyeznie kell a slow_query_log paramétert az Azure Portal vagy az Azure CLI használatával. Ha ez a paraméter engedélyezve van, a paraméter értékét long_query_time úgy is konfigurálnia kell, hogy megadja a lekérdezések által futtatható másodpercek számát, mielőtt "lassú futtatású" lekérdezésként azonosítanák őket. A paraméter alapértelmezett értéke 10 másodperc, de az értéket az alkalmazás SLA-jának igényeihez igazíthatja.

Azure Database for MySQL flexible server slow query log interface.

Bár a lassú lekérdezési napló nagyszerű eszköz a hosszú ideig futó lekérdezések nyomon követésére, bizonyos helyzetekben előfordulhat, hogy nem hatékony. Például a lassú lekérdezési napló:

  • Negatívan befolyásolja a teljesítményt, ha a lekérdezések száma nagyon magas, vagy ha a lekérdezési utasítás nagyon nagy. Ennek megfelelően állítsa be a long_query_time paraméter értékét.
  • Nem feltétlenül hasznos, ha engedélyezte a log_queries_not_using_index paramétert is, amely az összes sor lekérésére várt lekérdezések naplózását határozza meg. A teljes indexvizsgálatot végző lekérdezések kihasználják az index előnyeit, de a rendszer naplózza őket, mert az index nem korlátozza a visszaadott sorok számát.

Adatok lekérése a naplókból

A naplók a létrehozásuktól számított hét napig érhetők el. A lassú lekérdezési naplókat az Azure Portalon vagy az Azure CLI-vel listázhatja és letöltheti. Az Azure Portalon lépjen a kiszolgálóra a Figyelés területen válassza a Kiszolgálónaplók lehetőséget, majd a bejegyzés melletti lefelé mutató nyílra kattintva töltse le a vizsgálandó dátumhoz és időponthoz tartozó naplókat.

Azure Database for MySQL flexible server retrieving data from the logs.

Ha a lassú lekérdezési naplók diagnosztikai naplókon keresztül integrálva vannak az Azure Monitor-naplókkal, lekérdezéseket futtathat egy szerkesztőben, hogy tovább elemezze őket:

AzureDiagnostics
| where Resource == '<your server name>'
| where Category == 'MySqlSlowLogs'
| project TimeGenerated, Resource , event_class_s, start_time_t , query_time_d, sql_text_s
| where query_time_d > 10

Megjegyzés:

További példák a lassú lekérdezési naplók diagnosztikai naplókon keresztüli diagnosztizálására: Naplók elemzése az Azure Monitor-naplókban.

Az alábbi pillanatkép egy lassú lekérdezésmintát ábrázol.

# Time: 2021-11-13T10:07:52.610719Z
# User@Host: root[root] @  [172.30.209.6]  Id: 735026
# Query_time: 25.314811  Lock_time: 0.000000 Rows_sent: 126  Rows_examined: 443308
use employees;
SET timestamp=1596448847;
select * from titles where DATE(from_date) > DATE('1994-04-05') AND title like '%senior%';;

Figyelje meg, hogy a lekérdezés 26 másodperc alatt futott, több mint 443 ezer sort vizsgált meg, és 126 sornyi eredményt adott vissza.

Általában az Query_time és Rows_examined magas értékeket tartalmazó lekérdezésekre kell összpontosítania. Ha azonban magas Query_time, de csak néhány Rows_examined lekérdezést észlel, ez gyakran az erőforrás szűk keresztmetszetét jelzi. Ezekben az esetekben ellenőriznie kell, hogy van-e I/O-szabályozás vagy PROCESSZORhasználat.

Lekérdezés profilozása

Miután azonosított egy adott lassú futtatású lekérdezést, a EXPLAIN paranccsal és a profilkészítéssel részletesebb információkat gyűjthet.

A lekérdezési terv ellenőrzéséhez futtassa a következő parancsot:

EXPLAIN <QUERY>

Megjegyzés:

A EXPLAIN utasítások használatával kapcsolatos további információkért lásd : A EXPLAIN használata a lekérdezési teljesítmény profilkészítéséhez a rugalmas Azure Database for MySQL-kiszolgálón.

A lekérdezéshez a EXPLAIN-terv létrehozása mellett a SHOW PROFILE parancsot is használhatja, amely lehetővé teszi az aktuális munkamenetben futtatott utasítások végrehajtásának diagnosztizálását.

A profilkészítés engedélyezéséhez és egy adott lekérdezés profilozásához futtassa a következő parancsokat:

SET profiling = 1;
<QUERY>;
SHOW PROFILES;
SHOW PROFILE FOR QUERY <X>;

Megjegyzés:

Az egyes lekérdezések profilozása csak munkamenetekben érhető el, és az előzménykivonatok nem profilhatók.

Nézzük meg közelebbről, hogy ezekkel a parancsokkal profilozza a lekérdezést. Először engedélyezze a profilkészítést az aktuális munkamenethez, és futtassa a SET PROFILING = 1 következő parancsot:

mysql> SET PROFILING = 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

Ezután hajtsa végre az optimálisnál rosszabb lekérdezést, amely teljes táblázatvizsgálatot hajt végre:

mysql> select * from sbtest8 where c like '%99098187165%';
+----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
| id | k       | c                                                                                                                       | pad                                                         |
+----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
| 10 | 5035785 | 81674956652-89815953173-84507133182-62502329576-99098187165-62672357237-37910808188-52047270287-89115790749-78840418590 | 91637025586-81807791530-84338237594-90990131533-07427691758 |
+----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
1 row in set (27.60 sec)

Ezután megjelenítheti az összes elérhető lekérdezési profil listáját a SHOW PROFILES parancs futtatásával:

mysql> SHOW PROFILES;
+----------+-------------+----------------------------------------------------+
| Query_ID | Duration    | Query                                              |
+----------+-------------+----------------------------------------------------+
|        1 | 27.59450000 | select * from sbtest8 where c like '%99098187165%' |
+----------+-------------+----------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

Végül az 1. lekérdezés profiljának megjelenítéséhez futtassa a SHOW PROFILE FOR QUERY 1 parancsot.

mysql> SHOW PROFILE FOR QUERY 1;
+----------------------+-----------+
| Status               | Duration  |
+----------------------+-----------+
| starting             |  0.000102 |
| checking permissions |  0.000028 |
| Opening tables       |  0.000033 |
| init                 |  0.000035 |
| System lock          |  0.000018 |
| optimizing           |  0.000017 |
| statistics           |  0.000025 |
| preparing            |  0.000019 |
| executing            |  0.000011 |
| Sending data         | 27.594038 |
| end                  |  0.000041 |
| query end            |  0.000014 |
| closing tables       |  0.000013 |
| freeing items        |  0.000088 |
| cleaning up          |  0.000020 |
+----------------------+-----------+
15 rows in set, 1 warning (0.00 sec)

A leggyakrabban használt lekérdezések listázása az adatbázis-kiszolgálón

A lekérdezési teljesítmény hibaelhárításakor hasznos tudni, hogy mely lekérdezések futnak leggyakrabban a rugalmas Azure Database for MySQL-kiszolgálópéldányon. Ezekkel az információkkal felmérheti, hogy a leggyakoribb lekérdezések futtatása a szokásosnál tovább tart-e. Emellett a fejlesztő vagy a DBA felhasználhatja ezeket az információkat annak azonosítására, hogy egy lekérdezés hirtelen megnövekedett-e a lekérdezések végrehajtási számában és időtartamában.

A rugalmas Azure Database for MySQL-kiszolgálópéldány 10 legvégzettebb lekérdezésének listájához futtassa a következő lekérdezést:

SELECT digest_text AS normalized_query,
 count_star AS all_occurrences,
 Concat(Round(sum_timer_wait / 1000000000000, 3), ' s') AS total_time,
 Concat(Round(min_timer_wait / 1000000000000, 3), ' s') AS min_time,
 Concat(Round(max_timer_wait / 1000000000000, 3), ' s') AS max_time,
 Concat(Round(avg_timer_wait / 1000000000000, 3), ' s') AS avg_time,
 Concat(Round(sum_lock_time / 1000000000000, 3), ' s') AS total_locktime,
 sum_rows_affected AS sum_rows_changed,
 sum_rows_sent AS sum_rows_selected,
 sum_rows_examined AS sum_rows_scanned,
 sum_created_tmp_tables,
 sum_select_scan,
 sum_no_index_used,
 sum_no_good_index_used
FROM performance_schema.events_statements_summary_by_digest
ORDER BY sum_timer_wait DESC LIMIT 10;

Megjegyzés:

Ezzel a lekérdezéssel mérheti fel az adatbázis-kiszolgálón a legvégső lekérdezéseket, és megállapíthatja, hogy történt-e változás a legfelső lekérdezésekben, vagy a kezdeti teljesítménytesztben lévő meglévő lekérdezések futásideje megnőtt.

A 10 legdrágább lekérdezés felsorolása a teljes végrehajtási idő alapján

Az alábbi lekérdezés kimenete az adatbázis-kiszolgálón futó első 10 lekérdezésről és az adatbázis-kiszolgálón végrehajtott végrehajtások számáról nyújt információt. Egyéb hasznos információkat is tartalmaz, például a lekérdezés késéseit, zárolási idejét, a lekérdezési futtatókörnyezet részeként létrehozott ideiglenes táblák számát stb. Ezzel a lekérdezéskimenettel nyomon követheti az adatbázis legfontosabb lekérdezéseit, és módosíthatja az olyan tényezőket, mint a késések, ami arra utalhat, hogy a jövőbeni kockázatok elkerülése érdekében a lekérdezés tovább finomhangolható.

SELECT REPLACE(event_name, 'statement/sql/', '') AS statement, 
 count_star AS all_occurrences , 
 Concat(Round(sum_timer_wait / 1000000000000, 2), ' s') AS total_latency, 
 Concat(Round(avg_timer_wait / 1000000000000, 2), ' s') AS avg_latency, 
 Concat(Round(sum_lock_time / 1000000000000, 2), ' s') AS total_lock_time  , 
 sum_rows_affected AS sum_rows_changed, 
 sum_rows_sent AS  sum_rows_selected, 
 sum_rows_examined AS  sum_rows_scanned, 
 sum_created_tmp_tables,  sum_created_tmp_disk_tables, 
 IF(sum_created_tmp_tables = 0, 0, Concat( Truncate(sum_created_tmp_disk_tables / 
 sum_created_tmp_tables * 100, 0))) AS 
 tmp_disk_tables_percent, 
 sum_select_scan, 
 sum_no_index_used, 
 sum_no_good_index_used 
FROM performance_schema.events_statements_summary_global_by_event_name 
WHERE event_name LIKE 'statement/sql/%' 
 AND count_star > 0 
ORDER BY sum_timer_wait DESC 
LIMIT 10;

InnoDB-szemétgyűjtés figyelése

Ha az InnoDB szemétgyűjtés le van tiltva vagy késleltetve van, az adatbázis jelentős törlési késést okozhat, amely negatívan befolyásolhatja a tárterület kihasználtságát és a lekérdezési teljesítményt.

Az InnoDB visszaállítási szegmensek előzménylistájának hossza (HLL) a visszavonási naplóban tárolt változásrekordok számát méri. A növekvő HLL-érték azt jelzi, hogy az InnoDB szemétgyűjtési szálai (törlési szálak) nem tartják lépést az írási számítási feladatokkal, vagy hogy a törlést egy hosszú ideig futó lekérdezés vagy tranzakció blokkolja.

A szemétgyűjtés túlzott késése súlyos, negatív következményekkel járhat:

  • Az InnoDB rendszer tablespace bővül, így felgyorsítja a mögöttes tárterület növekedését. Időnként a rendszer táblatere több terabájttal megduzzadhat egy blokkolt kiürítés következtében.
  • A törléssel megjelölt rekordok nem lesznek időben eltávolítva. Ez az InnoDB-táblaterek növekedését okozhatja, és megakadályozhatja, hogy a motor újrahasználja a rekordok által foglalt tárolót.
  • Az összes lekérdezés teljesítménye csökkenhet, és a processzorhasználat az InnoDB storage-struktúrák növekedése miatt növekedhet.

Ennek eredményeképpen fontos figyelni a HLL-értékeket, mintákat és trendeket.

HLL-értékek keresése

A HLL-értéket a show engine innodb status parancs futtatásával találja meg. Az érték a kimenetben, a TRANSACTIONS fejléc alatt jelenik meg:

mysql> show engine innodb status\G 
*************************** 1. row *************************** 
 
(...) 
 
------------ 
TRANSACTIONS 
------------ 
Trx id counter 52685768 
Purge done for trx's n:o < 52680802 undo n:o < 0 state: running but idle 
History list length 2964300 
 
(...) 

A HLL-értéket a information_schema.innodb_metrics tábla lekérdezésével is meghatározhatja:

mysql> select count from information_schema.innodb_metrics  
    -> where name = 'trx_rseg_history_len'; 
+---------+ 
|  count  | 
+---------+ 
| 2964300 | 
+---------+ 
1 row in set (0.00 sec)

HLL-értékek értelmezése

A HLL-értékek értelmezésekor vegye figyelembe az alábbi táblázatban felsorolt irányelveket:

Érték Megjegyzések
Kevesebb mint ~10 000 Normál értékek, amelyek azt jelzik, hogy a szemétgyűjtés nem esik le.
~10 000 és ~1 000 000 között Ezek az értékek kisebb késést jeleznek a szemétgyűjtésben. Az ilyen értékek elfogadhatók lehetnek, ha állandóak maradnak, és nem növekednek.
~1 000 000-nél nagyobb Ezeket az értékeket meg kell vizsgálni, és szükség lehet korrekciós műveletekre

Túlzott HLL-értékek kezelése

Ha a HLL nagy kiugró értékeket vagy időszakos növekedést mutat, azonnal vizsgálja meg a rugalmas Azure Database for MySQL-kiszolgálópéldányon futó lekérdezéseket és tranzakciókat. Ezután megoldhatja azokat a számítási feladatokkal kapcsolatos problémákat, amelyek megakadályozhatják a szemétgyűjtési folyamat előrehaladását. Bár nem várható, hogy az adatbázis mentes legyen a törlési késéstől, nem hagyhatja, hogy a késés ellenőrizetlenül növekedjen.

Ha például a information_schema.innodb_trx tábla tranzakciós adatait szeretné lekérte, futtassa a következő parancsokat:

select * from information_schema.innodb_trx  
order by trx_started asc\G

Az oszlopban található trx_started részletek segítenek a tranzakció korának kiszámításában.

mysql> select * from information_schema.innodb_trx  
    -> order by trx_started asc\G 
*************************** 1. row *************************** 
                    trx_id: 8150550 
                 trx_state: RUNNING 
               trx_started: 2021-11-13 20:50:11 
     trx_requested_lock_id: NULL 
          trx_wait_started: NULL 
                trx_weight: 0 
       trx_mysql_thread_id: 19 
                 trx_query: select * from employees where DATE(hire_date) > DATE('1998-04-05') AND first_name like '%geo%';
(…) 

Az aktuális adatbázis-munkamenetekről , beleértve a munkamenet aktuális állapotában töltött időt is, tekintse meg a táblát information_schema.processlist . Az alábbi kimenet például egy munkamenetet jelenít meg, amely aktívan végrehajt egy lekérdezést az elmúlt 1462 másodpercben:

mysql> select user, host, db, command, time, info  
    -> from information_schema.processlist  
    -> order by time desc\G 
*************************** 1. row *************************** 
   user: test 
   host: 172.31.19.159:38004 
     db: employees 
command: Query 
   time: 1462 
   info: select * from employees where DATE(hire_date) > DATE('1998-04-05') AND first_name like '%geo%';
 
(...) 

Javaslatok

  • Győződjön meg arról, hogy az adatbázis elegendő erőforrással rendelkezik a lekérdezések futtatásához. Előfordulhat, hogy időnként fel kell skáláznia a példány méretét, hogy több processzormagot és további memóriát kapjon a számítási feladat ellátásához.

  • Kerülje a nagy vagy hosszú ideig futó tranzakciókat, ha kisebb tranzakciókra bontja őket.

  • A innodb_purge_threads a számítási feladatnak megfelelően konfigurálja a háttértisztítási műveletek hatékonyságának növelése érdekében.

    Megjegyzés:

    Tesztelje az egyes környezetek kiszolgálóváltozójának módosításait, hogy felmérje a motor viselkedésének változását.

  • A "Gazdagép CPU-százaléka", a "Gazdagép memória százaléka" és a "Teljes Csatlakozás ions" riasztások használatával értesítéseket kaphat, ha a rendszer túllépi a megadott küszöbértékeket.

  • A lekérdezési teljesítmény Elemzések vagy Azure-munkafüzetek használatával azonosíthatja a problémás vagy lassan futó lekérdezéseket, majd optimalizálhatja őket.

  • Éles adatbázis-kiszolgálók esetén rendszeres időközönként gyűjtse össze a diagnosztikát, hogy minden zökkenőmentesen fusson. Ha nem, elháríthatja és megoldhatja az ön által azonosított problémákat.

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.