Newsgroup: it.comp.www.php
Titolo: Come individuare query... "lente" ?




    Come da oggetto,

    il mio host, gratuito m'ha mandato questa segnalazione:



/**********************************************************************/

    We have detected that your account executing a slow MySQL queries.
    



    Slow MySQL queries are not allowed, because you share server
    resources with thousands of other users and your long lasting MySQL
    queries are slowering the server and other users are having MySQL
    performance and connectivity problems. Please optimize your MySQL
    queries as soon as possible.
    

    Here are some good articles how to optimize MySQL queries: 
http://www.google.com/search?q=optimize+mysql+queries



/****************************************************************************************/



    Come faccio a capire quale delle query usate (ne uso diverse in
    diversi punto del sito) crea il problema?

    Posso testare in qualche modo il sito per scoprire la query
    colpevole?

    Grazie in anticipo per qualsiasi dritta...








L'unico modo che mi viene in mente (se non puoi chiedergli la query in
questione, loggata in slowqueries.log) è di cronometrarle. Suppongo tu
usi un qualche framework, sicche' alla fine l'istruzione
	$exec = mysql_query(...)
ci sara' in pochissimi punti del codice. Forse in uno solo.
Be', in quei punti modifichi
+++	start_chrono();
	$exec = mysql_query($query);
+++	stop_chrono($query);
function start_chrono($report = false)
{
	static $chron = false;
	if ($report)
		return $chron;
	$chron = gettimeofday();
}
function stop_chrono($query)
{
	$SCALE	= 1000; // 1000000 per avere i microsecondi
	$LIMIT	= 1000; // Limite oltre il quale loggare
	$before = start_chrono(true);
	$after  = gettimeofday();
 
	$diff	= (($after[ 'sec']-$before[ 'sec'])
		  +($after['usec']-$before['usec']))*$SCALE;
	$diff	= floor($diff);
	// return $diff;
	if ($diff > $LIMIT)
	{
		$fp = fopen("slow-queries.log", "a");
		fwrite($fp, "-- query took $diff ms\n$query\n\n");
		fclose($fp);
	}
}
...all'incirca. Poi ti guardi cosa c'e' in slow-queries.log, se del
caso cambi il $LIMIT.
Leonardo S.E.&O.
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

Ti ringrazio, molto preciso.
Provvederò. 

Scusa... ho capito perfettamente il problema ma ora mi chiedo...
qual'è il range di tempo che troverà sul log per definire una query "lenta"?
Grazie ancora 

qual'è il range di tempo che troverà sul log per definire una query "lenta"?
Ottima domanda. Sono contento che tu abbia fatto questa domanda perche'
è importante e, senz'altro, un'informazione chiave per il funzionamento
del sistema. Dovremmo porci piu' domande di questo tipo.
La prossima domanda, grazie.
Leonardo politicante
(seriamente: non c'e' un criterio. Lento e' quando provider lo fischia.
Guarda le query che hai, ordinale per durata, e comincia a ottimizzarle
a partire da quella piu' lenta. Puoi chiedere su un gruppo di MySQL, o,
se le query le genera un framework, sulla lista di quel framework... se
c'e')



    Il 18/03/2011 10:30, Leonardo Serni ha scritto:
    
(seriamente: non c'e' un criterio. Lento e' quando
      provider lo fischia.


Guarda le query che hai, ordinale per durata, e comincia a ottimizzarle
a partire da quella piu' lenta. Puoi chiedere su un gruppo di MySQL, o,
se le query le genera un framework, sulla lista di quel framework... se
c'e')






    Ok, chiaro. Grazie ancora.





 La prossima domanda, grazie.
ROTFL !!!!!
ciao
Mauro