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:
- Prisijunkite prie savo serverio per SSH;
- Prisijunkite prie MySQL, pateikite root vartotojo slaptažodį įvesdami
mysql -u root -p
; - Į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 sudaroALTER TABLE
,ANALYZE TABLE
,CHECK TABLE
,CREATE INDEX
,DROP INDEX
,OPTIMIZE TABLE
irREPAIR 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 kintamojolog_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:
-a | Skaičiai nebus verčiami į N, tekstas nebus verčiamas į S. |
-n | Skaičiai su minimaliu skaitmenų skaičiumi bus verčiami į N. |
-g | Rezultatuose bus rodomos tik tos užklausos, kurios atitinka specifinį užklausų modelį. |
-h | Galima nurodyti serverio pavadinimą įrašų failo pavadinime. |
-i | Turi būti nurodytas serverio instancijos pavadinimas. |
-l | Užrakinimo laikas (“lock time”) neturėtų būti atimamas iš bendro laiko per kurį buvo vykdoma užklausa. |
-r | Rūšiavimas turėtų būti vykdomas atgaline tvarka. |
-s | Reikia 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 “). |
-t | Rodyti tik pirmas x užklausas. |
–debug | Rodyti derinimo (“debugging”) informaciją. |
–help | Rodyti pagalbos pranešimą ir atsijungti nuo sistemos. |
–verbose | Reikia įjungti režimą, kuris rodo daugiau informacijos apie tai, ką daro programa. |
mysqldumpslow
prieinamų parinkčių sąrašasSantrauka
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.