Zdravo,
MySQL DB server sa bazom koju cine samo innodb tabele ima problema sa slow upitima. Slow query log je pun SELECT/UPDATE upita koji traju po 10, 20, 30, 40, 100s...
E sada kada se taj isti SELECT upit (za koji je u logu zabelezeno da je trajao recimo 80s) pusti kroz EXPLAIN, pokazuje da pretrazuje samo 2 reda od nekih npr 700 000 ili vise. Indexi su postavljeni na pravom mestu i mysql ih koristi kako treba. Takodje, kada se upit pusti kroz neki klijent, rezultat se dobija momentalno tipa 0.015s ili slicno.
Kada se slow query log pusti preko mysqldumpslow sa top 10 slow querija i isti analiziraju kroz EXPLAIN i strukturu tabela rezultati su sledeci:
- grupe slow querija TOP 2,3,5,6,7,8,9,10 su kratki SELECT/UPDATE koji na ispravan nacin koriste indexe. Za UPDATE upite sam koristio proveru EXPLAIN SELECT....
i mislim da je to ispravna analogija za proveru UPDATE kroz EXPLAIN. Nijedan query ne ide kroz full table scann i max broj redova koji se pretrazuje je 2 i to samo kada
ima 2 zapisa kao rezultat.
- top 4 slow query je duzi JOIN query koji nisam uspeo da pustim kroz EXPLAIN. Provericu ovih dana da li su to temp tabele ili da pustam segment po segment upita.
Pretpostavljam da povecanje join cache moze mozda biti deo resenja. Inace odnos tmp tabela hdd/ram je sasvim ok.
- TOP 1 slow query je COMMIT. Negde sam procitao ranije da ovi simptomi (upiti koji su kroz EXPLAIN ok a javljaju se u slow qery log kod innodb sistema), ukazuju na
transakcije koje blokiraju jedna drugu i prave beskonacnu lock petlju - deadlock, sve dok mysql ne postane svestane toga i skine jednu od njih. Prakticno svi upiti u okviru transakcije koriste indexe i dobro su optimizovani kada se puste kao single query, medjutim zbog deadlock-a traju dugo.
Ukljucio sam na kratko innodb monitor da upisuje u error log ali nisam video nista sto ukazuje na deadlock. Inace error log se za razliku od general i slow loga nije punio uopste do danas i bio je prazan u zadnja dva meseca od kada je server neprekidno up (sto i nije nesto bitno za ovu pricu - u my.cnf je bila putanja do praznog error loga, a ps aux | grep mysqld je pokazivao putanju error loga sa kojom je mysqld startovan i koja ne postoji na hdd). Restart mysql-a je resio to.
Inace verzija mysql je 5.0.84 a slow guery je bio upaljen od ranije sa default vrednostima. Stavio sam sada da loguje sve upite koji su duzi od 3s i sve upite koje ne koriste indexe, pa da vidim ovih dana da li ce pokazati nesto novo.
Eksperimentisao sam i sa maatkit skriptama za parsovanje logova mk digit i mk advisor, ali mi se mysqldumpslow cini sasvim ok, jednostavan i pregledan.
Pozdrav.
MySQL DB server sa bazom koju cine samo innodb tabele ima problema sa slow upitima. Slow query log je pun SELECT/UPDATE upita koji traju po 10, 20, 30, 40, 100s...
E sada kada se taj isti SELECT upit (za koji je u logu zabelezeno da je trajao recimo 80s) pusti kroz EXPLAIN, pokazuje da pretrazuje samo 2 reda od nekih npr 700 000 ili vise. Indexi su postavljeni na pravom mestu i mysql ih koristi kako treba. Takodje, kada se upit pusti kroz neki klijent, rezultat se dobija momentalno tipa 0.015s ili slicno.
Kada se slow query log pusti preko mysqldumpslow sa top 10 slow querija i isti analiziraju kroz EXPLAIN i strukturu tabela rezultati su sledeci:
- grupe slow querija TOP 2,3,5,6,7,8,9,10 su kratki SELECT/UPDATE koji na ispravan nacin koriste indexe. Za UPDATE upite sam koristio proveru EXPLAIN SELECT....
i mislim da je to ispravna analogija za proveru UPDATE kroz EXPLAIN. Nijedan query ne ide kroz full table scann i max broj redova koji se pretrazuje je 2 i to samo kada
ima 2 zapisa kao rezultat.
- top 4 slow query je duzi JOIN query koji nisam uspeo da pustim kroz EXPLAIN. Provericu ovih dana da li su to temp tabele ili da pustam segment po segment upita.
Pretpostavljam da povecanje join cache moze mozda biti deo resenja. Inace odnos tmp tabela hdd/ram je sasvim ok.
- TOP 1 slow query je COMMIT. Negde sam procitao ranije da ovi simptomi (upiti koji su kroz EXPLAIN ok a javljaju se u slow qery log kod innodb sistema), ukazuju na
transakcije koje blokiraju jedna drugu i prave beskonacnu lock petlju - deadlock, sve dok mysql ne postane svestane toga i skine jednu od njih. Prakticno svi upiti u okviru transakcije koriste indexe i dobro su optimizovani kada se puste kao single query, medjutim zbog deadlock-a traju dugo.
Ukljucio sam na kratko innodb monitor da upisuje u error log ali nisam video nista sto ukazuje na deadlock. Inace error log se za razliku od general i slow loga nije punio uopste do danas i bio je prazan u zadnja dva meseca od kada je server neprekidno up (sto i nije nesto bitno za ovu pricu - u my.cnf je bila putanja do praznog error loga, a ps aux | grep mysqld je pokazivao putanju error loga sa kojom je mysqld startovan i koja ne postoji na hdd). Restart mysql-a je resio to.
Inace verzija mysql je 5.0.84 a slow guery je bio upaljen od ranije sa default vrednostima. Stavio sam sada da loguje sve upite koji su duzi od 3s i sve upite koje ne koriste indexe, pa da vidim ovih dana da li ce pokazati nesto novo.
Eksperimentisao sam i sa maatkit skriptama za parsovanje logova mk digit i mk advisor, ali mi se mysqldumpslow cini sasvim ok, jednostavan i pregledan.
Pozdrav.