<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mysql - ottimizzare query]]></title><description><![CDATA[<p dir="auto">Ciao a tutti...<br />
Ho un problemino, o meglio, una curiosità...<br />
prendiamo ad esempio una query tipo:</p>
<p dir="auto">SELECT * FROM tabella WHERE ntipo=1 ORDER BY TimeStamp DESC LIMIT 0,10</p>
<p dir="auto">Facendo l'analyze vedo che mysql mi fa un filesort per ordinare i dati e questo rallenta la query</p>
<p dir="auto">Avete qualche suggerimento su come poter ottimizzare la query/tabella?</p>
<p dir="auto">Ho fatto diversi test, con indici composti, singoli... ma temo che il problema sia quel "TimeStamp DESC" e purtroppo è imperativo usarlo perchè i dati devono essere ordinati per data decrescente...</p>
]]></description><link>https://connect.gt/topic/75170/mysql-ottimizzare-query</link><generator>RSS for Node</generator><lastBuildDate>Sun, 08 Mar 2026 05:13:01 GMT</lastBuildDate><atom:link href="https://connect.gt/topic/75170.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Jun 2008 14:18:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mysql - ottimizzare query on Fri, 20 Jun 2008 08:59:57 GMT]]></title><description><![CDATA[<p dir="auto">A titolo di cronaca... ho trovato questo link che parla di un bug con la found_rows()...</p>
<p dir="auto"><a href="http://bugs.mysql.com/bug.php?id=18454" rel="nofollow ugc">bugs.mysql.com/bug.php?id=18454</a></p>
<p dir="auto">Devo trovare il tempo di fare un po' di prove e non ce l'ho... uff</p>
]]></description><link>https://connect.gt/post/728102</link><guid isPermaLink="true">https://connect.gt/post/728102</guid><dc:creator><![CDATA[czero]]></dc:creator><pubDate>Fri, 20 Jun 2008 08:59:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Thu, 19 Jun 2008 22:20:52 GMT]]></title><description><![CDATA[<p dir="auto">in alcuni casi c'e' ancora la doppia query... le dovrei eliminare...<br />
ma il comando che mi dici tu mi mancava... grazie mille!<br />
Ho fatto un test al volo, ed effettivamente si ottiene il count in un baleno... domani mattina modifico la classe di paginazione e provo anche questa... ora sono un po' fuso per modificare script in produzione... :S</p>
]]></description><link>https://connect.gt/post/728101</link><guid isPermaLink="true">https://connect.gt/post/728101</guid><dc:creator><![CDATA[czero]]></dc:creator><pubDate>Thu, 19 Jun 2008 22:20:52 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Thu, 19 Jun 2008 22:00:58 GMT]]></title><description><![CDATA[<p dir="auto">a proposito di count(*), non è che per caso fai la doppia query per la paginazione degli annunci?<br />
query per la lista e query per il count per sapere quanti sono in totale?</p>
<p dir="auto">sai già che puoi usare<br />
"select SQL_CALC_FOUND_ROWS * from tabella limit 10"<br />
e poi prendere la count() totale con "SELECT FOUND_ROWS()" ?<br />
così facendo dovresti risparmiare qualcosina, ma è da testare.</p>
]]></description><link>https://connect.gt/post/728098</link><guid isPermaLink="true">https://connect.gt/post/728098</guid><dc:creator><![CDATA[saro78]]></dc:creator><pubDate>Thu, 19 Jun 2008 22:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Thu, 19 Jun 2008 21:50:52 GMT]]></title><description><![CDATA[<p dir="auto">Effettivamente i rapporti dei tempi sono quelli che hai visto anche tu<br />
Non credo che spezzare la tabella sia fattibile, perchè comunque ci sono altre query che non coinvolgono ntipo ma altri campi...<br />
La tabella è gia' stata scaricata rimuovendo gli annunci più vecchi, potrebbe arrivare anche a 800.000 se tolgo dei limiti che ho impostato...</p>
<p dir="auto">La soluzione estrema è già attiva... ho sviluppato un sistema di cache per le query che mi scarica il db da un po' di elaborazioni...</p>
<p dir="auto">Attualmente ho individuato 3 attività da fare:</p>
<ol>
<li>Creare un campo ts reverse da usare negli ordinamenti</li>
<li>Convertire in numerico un paio di campi usati abbastanza di frequente nelle ricerche</li>
<li>Eliminare dei count(*) che caricano....</li>
</ol>
<p dir="auto">Così, come indicazione... ti allego uno screenshot delle statistiche del server...</p>
]]></description><link>https://connect.gt/post/728104</link><guid isPermaLink="true">https://connect.gt/post/728104</guid><dc:creator><![CDATA[czero]]></dc:creator><pubDate>Thu, 19 Jun 2008 21:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Thu, 19 Jun 2008 18:01:32 GMT]]></title><description><![CDATA[<p dir="auto">ci provo, ho una tabella simile alla tua (100000 record) con indici su timestamp e ntipo separati:</p>
<ol>
<li>se faccio la query come detto da te, mi fa un filesort (1,160 sec)</li>
<li>se faccio la query senza where, niente filesort (0,0030 sec)</li>
<li>se aggiungo il campo ntipo all'indice di timestamp come punto 1)</li>
</ol>
<p dir="auto">sei certo di non poter risolvere la where a priori separando i record su più tabelle di ntipo? usare le merged table?</p>
<p dir="auto">il fatto che siano 600000 record vuol dire che hai 600000 annunci attivi? non puoi cancellare/spostare quelli più vecchi di n giorni?</p>
<p dir="auto">soluzione estrema: cachare l'html generato dalla query e refresharlo con i dati dal db solo ogni tot minuti, in questa maniera fai la query ogni tot minuti, il resto delle volte gli utenti vedranno a tutti gli effetti un sito statico.</p>
]]></description><link>https://connect.gt/post/728096</link><guid isPermaLink="true">https://connect.gt/post/728096</guid><dc:creator><![CDATA[saro78]]></dc:creator><pubDate>Thu, 19 Jun 2008 18:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Thu, 19 Jun 2008 13:16:32 GMT]]></title><description><![CDATA[<p dir="auto">Tabella: myisam<br />
Statistiche: non riesco ad isolarle, il server ha 11 database e questo seppure sia il più grande non è il più usato, vi lascio immaginare gli altri...<br />
Le query sono suddivise indicativamente in:<br />
insert: 30%<br />
update: 0<br />
select: 70%<br />
le insert sono praticamente tutte delayed, le update avvengono solo su altre tabelle del db ma non su questa e comunque con low_priority<br />
La select di cui sopra ha impiegato anche 4 secondi e sono richiamate da una pagina php<br />
I dati sono annunci, quindi titolo,desc, città, flag vari, datapubb</p>
]]></description><link>https://connect.gt/post/728105</link><guid isPermaLink="true">https://connect.gt/post/728105</guid><dc:creator><![CDATA[czero]]></dc:creator><pubDate>Thu, 19 Jun 2008 13:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Thu, 19 Jun 2008 13:00:17 GMT]]></title><description><![CDATA[<p dir="auto">potresti indicarci:</p>
<ul>
<li>il tipo della tabella (MyIsam, InnoDB, ect.)</li>
<li>il numero di query per secondo/minuto</li>
<li>la tipologia di query sopra (per es: 10%insert, 20%update, 70%select)</li>
<li>il tempo di esecuzione della select di cui stiamo parlando</li>
<li>l'applicativo/i che interroga/no il db</li>
<li>due righe su cosa c'è nella tabella e sul perché delle query che vengono eseguite<br />
?<br />
magari una soluzione si trova, non per forza a livello di indici e/o ottimizzazioni select.</li>
</ul>
]]></description><link>https://connect.gt/post/728097</link><guid isPermaLink="true">https://connect.gt/post/728097</guid><dc:creator><![CDATA[saro78]]></dc:creator><pubDate>Thu, 19 Jun 2008 13:00:17 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Thu, 19 Jun 2008 12:48:59 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://connect.gt/uid/25463">@saro78</a> said:</p>
<blockquote>
<p dir="auto">so che è banale ma:<br />
<a href="http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html" rel="nofollow ugc">dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html</a></p>
<p dir="auto">se non vanno bene le indicazioni sopra è perchè evidentemente non si tratta di una semplice SELECT come hai detto ma ci sono di mezzo join, funzioni, condizioni di where, ect.<br />
alla peggio dacci maggiori delucidazioni sulla struttura della tabella e sui dati che vuoi estrarne.</p>
</blockquote>
<p dir="auto">Ho già letto e riletto quella pagina ma purtroppo non mi è di aiuto...<br />
Credo sia quel "TimeStamp DESC" che mi provoca l'uso di un filesort... non sarebbe un problema, se in produzione la tabella non fosse di 600.000 record con numerosissime query....</p>
<p dir="auto">Ora sto' facendo delle verifiche memorizzando il timestamp come numero negativo... in questo modo l'indice sul campo è come se fosse sul campo originale ordinato dal più grande al più piccolo...</p>
<p dir="auto">I primi test sono confortanti... alcune query con complessità maggiore richiedono un quarto del tempo che richiedevano prima...</p>
]]></description><link>https://connect.gt/post/728100</link><guid isPermaLink="true">https://connect.gt/post/728100</guid><dc:creator><![CDATA[czero]]></dc:creator><pubDate>Thu, 19 Jun 2008 12:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Mysql - ottimizzare query on Wed, 18 Jun 2008 16:54:42 GMT]]></title><description><![CDATA[<p dir="auto">so che è banale ma:<br />
<a href="http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html" rel="nofollow ugc">dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html</a></p>
<p dir="auto">se non vanno bene le indicazioni sopra è perchè evidentemente non si tratta di una semplice SELECT come hai detto ma ci sono di mezzo join, funzioni, condizioni di where, ect.<br />
alla peggio dacci maggiori delucidazioni sulla struttura della tabella e sui dati che vuoi estrarne.</p>
]]></description><link>https://connect.gt/post/728095</link><guid isPermaLink="true">https://connect.gt/post/728095</guid><dc:creator><![CDATA[saro78]]></dc:creator><pubDate>Wed, 18 Jun 2008 16:54:42 GMT</pubDate></item></channel></rss>