PDA

View Full Version : [MySQL] Server LENTO!


Lim
19-12-2008, 10:01
Ho installato nel PC di un conoscente "USB WEBSERVER" per consentirgli di utilizzare in locale le funzionalità del server MySQL attraverso il browser (firefox).

Deve utilizzare un software gestionale di contabilità che gli ho scritto in PHP.

Alcune query coinvolgono alcune decine di migliaia di record e per completarne il caricamento occorrono diversi minuti. Questo è molto scomodo, perchè capita che deve fare alcune modifiche o inserimenti in sequenza e non può perdere 15-20 minuti ad attendere il completamento dell'operazione.

Fino al mese scorso utilizzava AppServ, ma per motivi pratici è dovuto passare ad un server portabile (anche se non lo usa direttamente dalla memoria USB, ma bensì dal disco rigido). Con AppServ, seppur lenta, l'elaborazione di quelle specifiche query era decisamente + rapida di quanto non sia ora.

Qualcuno può suggerirmi un approccio per cercare di velocizzare l'elaborazione? Non so, impostazioni specifiche nei file di configurazione o passare ad altri server portabili o ottimizzare le query ecc... :help:


P.S. la query che mi preme maggiormente di ottimizzare è una SELECT...

!fazz
19-12-2008, 10:56
Ho installato nel PC di un conoscente "USB WEBSERVER" per consentirgli di utilizzare in locale le funzionalità del server MySQL attraverso il browser (firefox).

Deve utilizzare un software gestionale di contabilità che gli ho scritto in PHP.

Alcune query coinvolgono alcune decine di migliaia di record e per completarne il caricamento occorrono diversi minuti. Questo è molto scomodo, perchè capita che deve fare alcune modifiche o inserimenti in sequenza e non può perdere 15-20 minuti ad attendere il completamento dell'operazione.

Fino al mese scorso utilizzava AppServ, ma per motivi pratici è dovuto passare ad un server portabile (anche se non lo usa direttamente dalla memoria USB, ma bensì dal disco rigido). Con AppServ, seppur lenta, l'elaborazione di quelle specifiche query era decisamente + rapida di quanto non sia ora.

Qualcuno può suggerirmi un approccio per cercare di velocizzare l'elaborazione? Non so, impostazioni specifiche nei file di configurazione o passare ad altri server portabili o ottimizzare le query ecc... :help:


P.S. la query che mi preme maggiormente di ottimizzare è una SELECT...

fagli installare xampp sul pc e non usare applicazioni portable?
per ottimizzare le query ricordati di fare i join dopo aver fatto i where :D

banryu79
19-12-2008, 11:58
Alcune query coinvolgono alcune decine di migliaia di record e per completarne il caricamento occorrono diversi minuti. Questo è molto scomodo, perchè capita che deve fare alcune modifiche o inserimenti in sequenza e non può perdere 15-20 minuti ad attendere il completamento dell'operazione.

Non sono un esperto ma ci dev'essere qualcosa che non quaglia per forza: 15 o 20 minuti per decine di migliaia di record mi sembra francamente assurdo.
Ci deve essere qualcosa di grave da qualche parte.

In attesa che utenti più esperti intervengano per consigliarti potresti spiegare più in dettaglio come è strutturato e distribuito l'applicativo e il database?

Lim
19-12-2008, 12:20
Purtroppo non credo che possa svincolarsi dal server portable...

Impiega circa 3 minuti per quella query, solo che capita sempre che deve farla in sequenza più di una volta e i tempi alla fine arrivano intorno ai 15 minuti per fare delle cose banalissime, sta sempre ad attendere l'elaborazione...

Per il discorso sui join, devo controllare bene il codice, forse potrebbe essere un modo per snellire, intanto GRAZIE A TUTTI!!!

!fazz
19-12-2008, 12:38
Purtroppo non credo che possa svincolarsi dal server portable...

Impiega circa 3 minuti per quella query, solo che capita sempre che deve farla in sequenza più di una volta e i tempi alla fine arrivano intorno ai 15 minuti per fare delle cose banalissime, sta sempre ad attendere l'elaborazione...

Per il discorso sui join, devo controllare bene il codice, forse potrebbe essere un modo per snellire, intanto GRAZIE A TUTTI!!!

è una delle ottimizzazioni più importanti, se fai un join di 2 tabelle da 1000 righe per poi ottenere con un where magari 5 valori sprechi un botto di tempo, è sempre meglio scremare i dati prima del join (ricorda che il join è l'operazione più esosa)

FixFixFix
19-12-2008, 13:19
1)se metti clausole where su campi che non sono chiavi primarie, genera gli indici.

2)nel database fai il detach di tutti i db che non ti servono.

3)XAMPP tutta la vita...

CozzaAmara
19-12-2008, 19:01
Hai controllato Firewall, Router ecc?

Lim
20-12-2008, 07:58
è una delle ottimizzazioni più importanti, se fai un join di 2 tabelle da 1000 righe per poi ottenere con un where magari 5 valori sprechi un botto di tempo, è sempre meglio scremare i dati prima del join (ricorda che il join è l'operazione più esosa)


Credo che questa sia la cosa + importante da fare allora...

Riporto qui sotto la query:
$query3="SELECT quantità,Nome_Prod,Nome_Cliente FROM clienti
INNER JOIN ordini INNER JOIN prodotti WHERE prodotti.nome= '$tmp[nome]' and
clienti.nome= '$tmp2[nome]' and prodotti.Nome=ordini.Nome_Prod and
clienti.Nome=ordini.Nome_Cliente and ordini.Giorno='" . $_POST['Giorno'] . "'";
$ordini = mysql_query($query3)
or die('Query non valida: ' . mysql_error());

Questa query fa parte di cicli while concatenati e di conseguenza viene eseguita all'incirca 3500 volte. Come potete vedere ci sono due JOIN.

I campi chiave coinvolti nelle clausole WHERE sono solo gli ultimi tre:

ordini.Nome_Prod
ordini.Nome_Cliente
ordini.Giorno


In giornata creerò gli indici per gli altri campi non chiave coinvolti nelle clausole WHERE e poi comunicherò i risultati...
Intanto ho creato al volo l'indice per il primo campo, ma la sua cardinalità è 0, devo popolarlo con un altro comando?


Comunque è strano, a casa mia lo script impiega poco più di 6 sec, mentre come dicevo, nel PC dove lo script viene usato effettivamente dal mio conoscente, impiega circa 3 minuti. La mia configurazione è un Athlon X2 Dual Core con freq effettiva dei due core a 2800MHz e 3 GB di ram, mentre la sua è un P4 a 3000MHz single core e 1GB di ram. Ovviamente c'è una bella differenza tra le due macchine, ma la sua impiega un ordine di grandezza in +, sinceramente mi sembra eccessivo...