MySQL Lėtų Užklausų Identifikavimas: Lėtų Užklausų Įrašų Pagrindai

Atsiradus MySQL veikimo problemoms, vienas iš pagrindinių triktis šalinančių veiksmų yra nustatyti ilgai veikiančias užklausas ir jas optimizuoti. Apžvelgsime MySQL funkciją, padedančią nustatyti ilgą laiką veikiančias užklausas – MySQL lėtų užklausų įrašus (“slow query log”).

Kas Yra Lėtų Užklausų Įrašai?

MySQL lėtų užklausų įrašai susideda iš SQL užklausų, kurioms vykdyti reikia daugiau laiko nei nurodyta long_query_time kintamajame. Šio kintamojo minimalios ir numatytosios reikšmės yra atitinkamai 0 ir 10. Jei užklausos vykdymas užtrunka ilgiau nei nustatyta, serveris padidina Slow_queries kintamojo reikšmę – šio kintamojo reikšmė didėja neatsižvelgiant į tai ar lėtų užklausų įrašai yra įjungti, ar ne. Verta paminėti, kad mysqld įrašo užklausą į lėtų užklausų žurnalą tik tada, kai ji yra pilnai įvykdyta ir visi užraktai (“LOCK“) nebeveikia, todėl įrašų tvarka gali skirtis nuo užklausų vykdymo tvarkos.

Lėtų Užklausų Įrašų Įjungimas

Norėdami įjungti lėtų užklausų įrašus MySQL ekosistemoje, atlikite šiuos veiksmus:

  1. Prisijunkite prie savo serverio per SSH;
  2. Prisijunkite prie MySQL, pateikite root vartotojo slaptažodį įvesdami mysql -u root -p;
  3. Įjunkite lėtų užklausų įrašus įvesdami SET GLOBAL slow_query_log = 'ON';

Kai lėtų užklausų įrašai yra įjungti, pagal numatytuosius nustatymus yra įrašomos visos užklausos, kurių įvykdymas trunka ilgiau nei 10 sekundžių. Norėdami pakeisti intervalą įveskite šią komandą, kur x yra laikas sekundėmis:

SET GLOBAL long_query_time = x;

Jei lėtų užklausų įrašų failo pavadinimas nėra nurodytas, numatytasis pavadinimas yra host_name-slow.log. Šis failas yra /var/lib/mysql aplanke – serveris sukuria šį failą ten, nebent yra nurodyta kita direktorija: norėdami pakeisti įrašų vietą arba failo pavadinimą, panaudokite užklausą SET GLOBAL slow_query_log_file = '/direktorija/failopavadinimas';

Norėdami įsitikinti, kad lėtų užklausų įrašai veikia tinkamai, iš naujo nustatykite sesijos kintamuosius atsijungdami ir vėl prisijungdami prie MySQL ir įveskite šią komandą, kur x yra laikas sekundėmis:

SELECT SLEEP(x);

Lėtų užklausų įrašuose dabar turėtų atsirasti informacija apie užklausą.

Norėdami išjungti lėtų užklausų įrašus panaudokite SET GLOBAL slow_query_log = 'OFF'; užklausą.

MySQL Lėtų Užklausų Įrašai Iš Vidaus

Lėtų užklausų įrašai gali būti optimizuojami įjungiant tam tikrus kintamuosius arba naudojant tam tikras parinktis:

  • Tam, kad būtų galima į įrašus įrašyti administracinius teiginius, įjunkite kintamąjį log_slow_admin_statements kintamąjį. Administracinius teiginius sudaro ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE ir REPAIR TABLE užklausos;
  • Norėdami registruoti užklausas kurios nenaudoja indeksų įjunkite log_queries_not_using_indexes kintamąjį. Verta paminėti, kad kai į lėtų užklausų įrašus įrašomos užklausos kurios nenaudoja indeksų lėtų užklausų žurnalas gali greitai išaugti – norėdami nustatyti šių užklausų limitą pakeiskite kintamojo log_throttle_queries_not_using_indexes reikšmę į 1 (numatytoji reikšmė yra 0);
  • Kintamasis log_throttle_queries_not_using_indexes riboja užklausų įrašomų į failą per minutę skaičių. Numatytoji vertė 0 reiškia, kad nėra jokių apribojimų;
  • Užklausos kurios pasiekia mažiau įrašų negu nustatyta min_examined_row_limit kintamajame nebus fiksuojami lėtų užklausų įrašuose;
  • Pagal numatytuosius nustatymus replikacijos “slave” serveris neįrašo pakartotinių užklausų į lėtų užklausų įrašus, nors tai galima pakeisti įjungiant kintamąjį log_slow_slave_statements. Šis kintamasis veikia tik tada, jei naudojama teiginiais grįsta replikacija;
  • Serveris į lėtų užklausų įrašus neįrašo užklausos, kurios yra užklausų talpykloje (“cache”).

Taip pat verta paminėti, kad serveris įrašo mažiau informacijos į lėtų užklausų įrašus jei naudojama --log-short-format parinktis.

Lėtų Užklausų Įrašų Failo Turinys

Kai įjungti lėtų užklausų įrašai serveris rašo reikšmes į direktoriją, nustatytą log_output kintamajame – jei vieta nustatyta į NONE į lėtų užklausų įrašus nebus rašomos jokios užklausos net ir tuo atveju, jei lėtų užklausų įrašai bus įjungti.

Failą /var/log/mysql/mysql-slow.log gali pasiekti tik root vartotojas naudodamasis sudo privilegijomis – prieiga prie failo naudojant kitą vartotoją nėra galima.

Prieš lėtų užklausų įrašus rašomas simbolis # ir juose yra:

  • Query_time vertė reiškia užklausos vykdymo laiką sekundėmis;
  • Lock_time vertė nurodo laiką užraktams (“LOCK“) gauti sekundėmis;
  • Rows_sent vertė yra įrašų, išsiųstų klientui, skaičius;
  • Rows_examined yra įrašų, prie kurių priėjo serveris, skaičius.

MySQL užklausų įrašymas vengia slaptažodžių įrašymo į įrašus paprastu tekstu. MySQL vengia įrašyti slaptažodžius paprastu tekstu CREATE USER, ALTER USER ir GRANT teiginiams su IDENTIFIED BY priedėliais, SET PASSWORD užklausai, SLAVE START užklausai su PASSWORD priedėliu, taip pat CREATE SERVER ir ALTER SERVER užklausoms su OPTIONS priedėliu.

Lėtų Užklausų Įrašų Tyrimas Naudojant mysqldumpslow

mysqldumpslow yra įrankis skirtas lėtų užklausų įrašų tyrimui ir panašių užklausų sugrupavimui. Žemiau pateikiami keli šio įrankio naudojimo pavyzdžiai:

mysqldumpslow užklausa be jokių papildomų priedėlių parodys visų užklausų, vykdytų duomenų bazėje, rezultatus.
Pavyzdžiui, užklausa mysqldumpslow /var/log/mysql/mysql-slow.log galėtų pateikti šiuos rezultatus (rezultatai yra pavyzdys):

Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 1 Time=1.17s (1s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
SELECT * FROM table_1

Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 15 Time=127.41s (127s) Lock=0.00s (0s) Rows=851752.0 (851752), root[root]@localhost
SELECT * FROM table_2

  • Užklausa mysqldumpslow -r -t 10 /var/log/mysql/mysql-slow.log parodys paskutines 10 užklausų naudojant atvirkštinę rūšiavimo tvarką.

Yra daugybė užklausų kurias galima analizuoti naudojant šį įrankį – tereikia įgauti šiek tiek praktinių žinių.

mysqldump palaiko įvairias parinktis:

Parinkties Pavadinimas
Aprašymas
-aSkaičiai nebus verčiami į N, tekstas nebus verčiamas į S.
-nSkaičiai su minimaliu skaitmenų skaičiumi bus verčiami į N.
-gRezultatuose bus rodomos tik tos užklausos, kurios atitinka specifinį užklausų modelį.
-hGalima nurodyti serverio pavadinimą įrašų failo pavadinime.
-iTuri būti nurodytas serverio instancijos pavadinimas.
-lUžrakinimo laikas (“lock time”) neturėtų būti atimamas iš bendro laiko per kurį buvo vykdoma užklausa.
-rRūšiavimas turėtų būti vykdomas atgaline tvarka.
-sReikia apibrėžti kaip rūšiuoti išvestį. Išvestis gali būti rūšiuojama pagal užklausos laiką (“t“), vidutinį užklausų laiką (“at“), užraktų (“LOCK”) laiką (“t“), vidutinį užraktų (“LOCK”) laiką (“al“), išsiųstus įrašus (“r“), vidutinį išsiųstų įrašų skaičių (“ar“) arba pagal skaičių (“c“).
-tRodyti tik pirmas x užklausas.
–debugRodyti derinimo (“debugging”) informaciją.
–helpRodyti pagalbos pranešimą ir atsijungti nuo sistemos.
–verboseReikia įjungti režimą, kuris rodo daugiau informacijos apie tai, ką daro programa.
mysqldumpslow prieinamų parinkčių sąrašas

Santrauka

Lėtų užklausų įrašų funkcija MySQL leidžia programuotojams fiksuoti užklausas viršijančias nurodytą laiko intervalą. Tokiu būdu programuotojai gali daug lengviau rasti kliūtis kurios trukdo MySQL užklausoms ir pašalinti neefektyvias ar per daug laiko reikalaujančias užklausas.

Leave a Reply

Your email address will not be published. Required fields are marked *