frame

Sveiki apsilankę!

Jei forume lankaisi pirmą kartą, kviečiame registruotis ir prisijungti prie diskusijų.

Prisijungti Registruotis

MySQL lėtų užklausų paieška

iv_vytenisgiv_vytenisg Super Moderator
attachment.php?attachmentid=433&stc=1&d=1552561601

Naudojantis MySQL duomenų bazėmis galite susidurti su įvairiomis vykdomų užklausų problemomis. Kartais jos pasireikšti tik pradėjus darbą su duomenų bazių duomenimis. Daugumoje duomenų bazių sistemų, įtraukiant, bet neapsiribojant MySQL, užklausos formuluotė turi pasibaigti simboliu ";", kaip pavyzdžiui:
mysql> SHOW * FROM lentelės_pavadinimas;

Jeigu nepateiksite ";" simbolio užklausos pabaigoje komandinė eilutė ir toliau leis Jums pildyti užklausos tekstą spaudžiant ENTER iki tol kol nebus nurodytas pageidaujamas simbolis. Todėl užklausoje gali atsirasti nepageidaujamas tekstas.

Viena iš dažniausiai pasitaikančių problemų susijusių su duomenų bazėmis yra ilgai vykdomos užklausos. Norint sužinoti lėtos užklausos priežastį reikėtų įjungti lėtų užklausų išrašo fiksavimą. Tam atlikti atsidarykite failą mysqld.cnf, kuris yra skirtas konfigūruoti MySQL nustatymus serveryje. Šis failas standartiškai yra saugomas šioje /etc/mysql/mysql.conf.d/ direktorijoje. Norint koreguoti šį failą naudokite komandą:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Slinkite per failą kol pamatysite nurodytas eilutes:
. . .
#slow_query_log         = 1
#slow_query_log_file    = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
. . .

Šios užkomentuotos eilutės suteikia standartinius nustatymus MySQL lėtų užklausų išrašui. Žemiau aprašome kiekvienos eilutės reikšmes:

* slow-query-log - reikšmė 1 reiškia, kad lėtų užklausų fiksavimas yra įjungtas.
* slow-query-log-file - šio parametro reikšmėje nurodomas lėtų užklausų saugumo failo kelias. Šiuo atveju jis yra /var/log/mysql-slow.log faile.
* long_query_time - nurodant 2 reikšmę yra nustatoma, kad bus fisuojamos visos užklausos, kurios trunka ilgiau nei 2 sekundes.
* log_queries_not_using_indexes - šis parametras taip pat nurodo, kad būtų saugomos ir visos užklausos, kurios nesiindeksuoja.

Atkomentuokite kiekvieną eilutę pašalindami grotelių simbolį "#". Šis failas turėtų atrodyti taip:
. . .
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes
. . .

SVARBU:
Jeigu naudojate MySQL 8+ versiją šios eilutės nebus įtrauktos į mysqld.cnf pagal nutylėjimą. Tokiu atveju šias eilutes galite nurodyti failo apačioje:
. . .
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes

Įjungus lėtų užklausų išrašą turite išsaugoti ir uždaryti failą. Tada perkraukite MySQL tarnybą:
sudo systemctl restart mysql

Atlikus šiuos nustatymus Jūs galite peržiūrėti problemines užklausas peržiūrint lėtų užklausų failą. Galite peržiūrėti išrašą po vieną eilutę naudodami less komandą:
sudo less /var/log/mysql_slow.log

Kai surasite užklausą, kuri sukelia problemų, turėtumėte optimizuoti užklausas bei/arba lenteles.

MySQL papildomai įtraukia EXPLAIN formuluotę, kurioje suteikiama informacija kaip MySQL vykdo užklausas. MySQL dokumentacijoje rasite paaiškinimą kaip naudoti EXPLAIN nekorektiškų užklausų išskyrimui.
Norėdami palikti komentarą, turite prisijungti arba registruokis.