Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Dirty Harry
HV Guru
liitunud: 05.09.2002
|
03.04.2014 13:21:55
MySQL slow query log |
|
|
Tere.
Tuli virtuaalserveri teenusepakkujalt selline automaatne e-mail:
Spoiler 
MySQL serveri jälgimisrobot on tuvastanud, et Teie kasutajakonto alt on tehtud liiga palju serverit koormavaid MySQL päringuid.
Kui see jutt tundub Teile arusaamatu, edastage palun see e-mail oma kodulehekülje haldajale. On tähtis, et selles e-mailis sisalduva info põhjal võetakse midagi ette, sest vastasel korral võidakse Teie kodulehekülg automaatselt sulgeda, et vältida serveri ülekoormamist.
Käesoleva kirjaga on kaasas fail queries.txt, mis sisaldab kõikiMySQL päringuid, mis on kulutanud serveri ressursse rohkem kui 5 sekundit. Kuna MySQL päringuid võidakse teha ühes sekundis kuni mitusada tükki, on väga oluline, et need kõik oleksid kiired ja täpsed.
Palun analüüsige kaasasolevas failis väljatoodud päringuid ning optimeerige neid seejärel selliselt, et need saaksid serverilt vastuse lühema aja jooksul. See tähendab eelkõige indeksite lisamist veergudele, mille järgi tehakse enamus päringutest, ning konkreetsete tulemusveergude määramine SELECT * asemel. Tuleb arvestada, et igasuguse tabelite liitmise puhul (näiteks LEFT JOIN) peavad liitmiseks kasutatavad kattuvad tabelite veerud kindlasti olema indekseeritud. Ka tuleb jälgida, et MySQL tabel ei kasvaks liiga suureks. Mittevajalik ja ebaoluline info tuleb aeg-ajalt kustutada.
Optimeerimise kohta võite leida kasulikku infot järgnevatelt
lehekülgedelt:
http://linuxformat.co.uk/wiki/index.php/PHP_-_Optimising_MySQL_queries
http://hackmysql.com/optimize
http://www.databasejournal.com/features/mysql/article.php/1382791
Kaasas logi:
Spoiler 
# User@Host: xxxxxx_yyyyyyyy[xxxxxx_yyyyyyyy] @ localhost []
# Query_time: 5.036314 Lock_time: 0.000114 Rows_sent: 1 Rows_examined: 12783
use xxxxxx_yyyyyyyy;
SET timestamp=1395961378;
SELECT COUNT(*) AS max
FROM pixelpost_pixelpost AS p, pixelpost_tags AS t
WHERE t.alt_tag LIKE '' AND p.id = t.img_id AND p.datetime<='2014-03-28 02:02:52'
GROUP BY t.tag
ORDER BY max DESC
LIMIT 1; |
# User@Host: xxxxxx_yyyyyyyy[xxxxxx_yyyyyyyy] @ localhost []
# Query_time: 5.525273 Lock_time: 0.000123 Rows_sent: 1986 Rows_examined: 14768
SET timestamp=1395961380;
SELECT ROUND(COUNT(*)/95,1) AS rank, tag, COUNT(*) as cnt
FROM pixelpost_pixelpost AS p, pixelpost_tags AS t
WHERE t.alt_tag LIKE '' AND p.id = t.img_id AND p.datetime<='2014-03-28 02:02:50'
GROUP BY tag
ORDER BY tag;jne, järjest analoogsed päringud. |
Kuna ma MySQL'i nüansse väga ei tunne siis ei oska hästi midagi peale hakata. Tegu on Pixelpostil jooksva leheküljega, mis siis kasutab all MySQL baasi. Arvestades, et Pixelposti näol on tegu aastaid arendusest maas oleva lahendusega siis ma ise kardan, et äkki on tegu mingitsorti (spämmi)robotiga, mis käis indekseerimas.
Igaljuhul - mida võiks ette võtta? Ma ise mõtlen juba tükk aega, et peaks Pixelposti pealt migrama kodulehe millegi teise peale kuna ilmselgelt pole Pixelposti näol enam tegu turvalise lahendusega. Või annaks kuidagi lehte/baasi kaitsta? Või peakski indeksite lisamise suunas vaatama?
|
|
Kommentaarid: 181 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
145 |
|
tagasi üles |
|
 |
kullar
HV kasutaja

liitunud: 26.11.2006
|
03.04.2014 16:29:37
|
|
|
Proovi lasta käima EXPLAIN käsuga mõned päringud ja postita vastused siia. Lase käima selliselt:
EXPLAIN SELECT COUNT(*) AS max
FROM pixelpost_pixelpost AS p, pixelpost_tags AS t
WHERE t.alt_tag LIKE '' AND p.id = t.img_id AND p.datetime<='2014-03-28 02:02:52'
GROUP BY t.tag
ORDER BY max DESC
LIMIT 1
Ehk iga päringu ette pane EXPLAIN käsk ja paned mõned tulemused siia. See aitab näha, et kas väljd on üldse indekseeritud, kui pole, siis tuleks seda teha.
_________________ Online Perekonna Eelarve, Keerukamad veebipõhised infosüsteemid jms |
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
25 |
|
tagasi üles |
|
 |
Dirty Harry
HV Guru
liitunud: 05.09.2002
|
|
Kommentaarid: 181 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
145 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
10.04.2014 09:44:56
|
|
|
esiteks count(*) vist tuleks asendada millegi konkreetse countimiseg, count(p.id) näiteks. Ja nagu öeldud tuleb vanu andmeid aegajalt kustutada (arhiveerida)
Arvatavasti "AND p.datetime<='2014-03-28 02:02:52' " tingimus tagastab liiga plaju ridu ja tulemus ei mahu enam mällu ning sorteerimiseks kasutatakse faile kettal mis teeb asja kordi aeglasemaks.
võibolla aitab ka p.datetime veerule indeksi tegemine.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
renekas
HV kasutaja

liitunud: 25.03.2004
|
10.04.2014 09:59:24
|
|
|
Where lausete väljadele tee indeksid ja kui countid siis counti indekseeritud väljadelt mitte tervet tabelit.
|
|
Kommentaarid: 22 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
21 |
|
tagasi üles |
|
 |
kullar
HV kasutaja

liitunud: 26.11.2006
|
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
25 |
|
tagasi üles |
|
 |
renekas
HV kasutaja

liitunud: 25.03.2004
|
10.04.2014 16:20:52
|
|
|
pixelpost_pixelpost ID peale ka kui juba ei ole.
|
|
Kommentaarid: 22 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
21 |
|
tagasi üles |
|
 |
Dirty Harry
HV Guru
liitunud: 05.09.2002
|
|
Kommentaarid: 181 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
145 |
|
tagasi üles |
|
 |
kullar
HV kasutaja

liitunud: 26.11.2006
|
10.04.2014 23:41:32
|
|
|
renekas kirjutas: |
pixelpost_pixelpost ID peale ka kui juba ei ole. |
Kes see siis ID peale paneb, kui see on PRIMARY key? Sinna pole seda küll vaja ja tegelikkuses on see olemas, kui tehakse primary key.
Millegipärast ta nüüd ei kasuta seda indexit, mille lisasid. Kas välja pikkused(id ja img_id) ja tüübid on erinevad?
_________________ Online Perekonna Eelarve, Keerukamad veebipõhised infosüsteemid jms |
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
25 |
|
tagasi üles |
|
 |
renekas
HV kasutaja

liitunud: 25.03.2004
|
11.04.2014 10:20:12
|
|
|
Kus mina tean kas on primary key või mitte, kohtan pidevalt selliseid tabeleid kuhu pole üldse contrainte pandud.
|
|
Kommentaarid: 22 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
21 |
|
tagasi üles |
|
 |
kullar
HV kasutaja

liitunud: 26.11.2006
|
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
25 |
|
tagasi üles |
|
 |
serk
HV kasutaja
liitunud: 24.05.2003
|
04.06.2014 14:23:14
|
|
|
Tuimalt indeksid peale või
Klge mehed, lugege natuke ennem ja tehke endale selgeks, mis asi on indeks ja kuidas ta töötab.
Indeksit kasutatakse juhul, kui andmehulk mida päritakse tabelist, jääb ca 3% mahu sisse. Kui tagastatavate andmete hulk on suurem, teeb indeks asja üldjuhul hullemaks. Kui vaadata antud päringut, siis probleem on andmehulgas mida päritakse.
EXPLAIN SELECT COUNT(*) AS max
FROM pixelpost_pixelpost AS p, pixelpost_tags AS t
WHERE t.alt_tag LIKE '' AND p.id = t.img_id AND p.datetime<='2014-03-28 02:02:52'
GROUP BY t.tag
ORDER BY max DESC
LIMIT 1
võetakse ju kõik andmed mis on vanemad kui 28.03 - mis seal siis oodata? Arvata võib, et ajaloos on palju palju datat. Full Scan tehakse sellisel juhul anyway, olenemata kas paned sinna indeksi või mitte. Sa kammid lihtsalt kõik andmed oma kuupäeva filtri tõttu läbi.
Ja see on nagu kõige tobedam "häkk" mida teha annab, arvates, et see piirab kuidagi baasi päringu mahtu või tööd: "ORDER BY max DESC LIMIT 1 " Isegi loogiliselt mõeldes peaks aru saama, mis siin valesti on koormuse mõistes(miks see ei aita koormust lahendada)
pane datetime betweeni vahele, from ja to, IO väheneb sul kolaki kohe. Peale seda vaata andmehulka mida päritakse. Kui see jääb 3% sisse, pane indeksid peale. Peale seda vaata päringut jälle EXPLAIN planiga ja kas asjad paranesid või mitte.
Samuti võid partitsioneerida tabeleid, pakun, et arhiveerimine siin juhul on keeruline. isegi PhpMyAdmin minuarust suudab näidata indeksi mõtekust veergudel, kasuta kasvõi seda abina enda jaoks.
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
04.06.2014 16:00:10
|
|
|
Saan ma õigesti aru - päring loendab/grupeerib kirjeid vastavalt veeru TAG väärtusele (mida see sisaldab? aga teised päringus kasutatud veerud?) ja tagastab siis suurima väärtuse (kirjete arvu) ilma TAG väärtuseta? Mida selline päring sisuliselt annab? Näiteks: "siin foorumis on postituste arvu järgi suurimas teemas 420 postitust". No mida sellise asjaga peale hakata? Oleks seal "tag, count(*)", saaks aru (suurim teema postituste arvu järgi on X ja selles on Y kirjet).
PS. ma eeldan, et p.id on PK ja t.img_id-le on defineeritud FK, mis viitab esimesele?
PPS. Ma pole ise MySQLi tarbinud, ainult suured kommertstooted.
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
|