PDA

View Full Version : client mysql lento su una tabella


mmiat
16-11-2016, 15:55
scrivo qui visto che magari è un topic più da "server"....

ho 2 pc Windows 7, uno monta un gestionalino in java con db mysql 5, l'altro il medesimo gestionale in versione client che usa il db mysql del primo

il client, una volta avviato, apre tranquillamente le varie schede relative ad anagrafiche varie, fatture, ecc. ma quando apre l'elenco degli ordini si pianta di brutto, e ci mette diversi secondi per caricare i dati (la tabella contiene circa 25.000 righe, poi quando apre l'ordine carica il dettaglio ma si tratta di 4-5 righe ciascuna).

la cosa va' avanti da circa 10 giorni, mentre per anni non ha mai dati problemi. ho controllato (e disabilitato) antivirus e firewall, ma non cambia niente. disabilitato anche ipv6. provato ad ottimizzare le tabelle con mysqlcheck. niente di niente. l'unico sospetto è il KB3197868 che si è installato il 9 di questo mese.

cos'altro potrei guardare per fare un debug?

zeMMeMMez
16-11-2016, 17:57
anche se non me ne intendo affatto proverei mysql.exe

mmiat
16-11-2016, 19:54
anche se non me ne intendo affatto proverei mysql.exe

scusa ma non ho capito cosa intendi

Kaya
17-11-2016, 08:58
Troppo generico come problema.
Farei diverse prove
1) Una select direttamente dalla tabella funziona ? (usando la conosle o mysqlworkbench o altro tool)
2) Oltre a mysqlcheck hai provato mysqloptimize ?
3) C'è qualcosa nei log?
4) Logghi le query sql lente? Rientra nel caso?
5) Quando fai questa particolare ricerca, la cpu che fa?
6) Hai già provato con un altro pc a buttare su il backup e collegarti lì?

!fazz
17-11-2016, 09:19
sarebbe inoltre utile avere alcune indicazioni sulla macchina dove gira il dbms (processore memoria e disco) e i settaggi del my.ini

spesso problemi di performance si hanno a causa di cache troppo limitata (o di errori di progettazione del db ma che purtroppo è di competenza della ditta che ha sviluppato il gestionale

mmiat
17-11-2016, 10:52
6) Hai già provato con un altro pc a buttare su il backup e collegarti lì?

sarà la prima prova che faccio
poi recupero anche le altre info che mi avete chiesto e vedo di raccapezzarmici
intanto grazie

Tasslehoff
21-11-2016, 22:14
Oltre ai consigli già dati e che quoto io mi concentrerei su questi aspetti:
1) cerca di individuare le query lente (http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html)
2) cerca di riprodurre il problema magari utilizzando l'istruzione explain per capire come viene effettuata la query(http://dev.mysql.com/doc/refman/5.7/en/explain.html)
3) verifica la documentazione del gestionale, ha delle guide di performance tuning? Ci sono operazioni schedulate che non girano?
4) verifica i campi oggetto della query, hanno indici?
5) prova ad aggiornare gli indici usando le istruzioni optimize (http://dev.mysql.com/doc/refman/5.7/en/optimize-table.html) e analyze (http://dev.mysql.com/doc/refman/5.7/en/analyze-table.html)
6) se non ci sono indici prova a crearli e verifica se questo migliora la situazione

I punti fino a 4 puoi provarli direttamente sul db, non possono provocare alcun danno, i punti 5 e 6 modificano qualcosa ma non sono distruttive, se però non ti senti sicuro puoi sempre fare un dump e ripristinarlo su un nuovo database.

mmiat
04-01-2017, 09:14
non ne vengo fuori....
1. temo non sia colpa di mysql, se infatti loggo le query lente nessuna supera 1 secondo....
2. non ho capito bene come usarlo, riproverò
3. il gestionale è un programmino in java fatto da un mio amico, gli ho chiesto info ma non ha saputo darmi nemmeno lui indicazioni, è un programma vecchio e non più mantenuto, che comunque ha funzionato benissimo per 10 anni
4. e 6. gli indici ci sono
5. ho fatto qualche tentativo ma non è cambiato nulla

che diavolo sarà cambiato? magari qualcosa in java?

zeMMeMMez
04-01-2017, 10:27
finquando non mi bannano-sospendono ti rispondo.

qualsiasi cosa tu faccia è inutile se
1) non logghi tutte le query (ti basta un banale proxy mysql, o se sei meno pratico anche lo slow log)
2) individuata la query "fatale", la fai eseguire a mysql.exe (cioè al client mysql), tagliando via tutta la croppa java
3) se a quel punto è ancora lenta, ovviamente, vai di EXPLAIN e magari EXPLAIN EXTENDED (se usi mariadb).
4) poi inizi a valutare l'esistenza di costrutti inadatti (tipo IN con mysql, cioè in assenza di subquery dipendenti materializzate)
5) valuti la selettività degli indici
6) controlli i parametri del server (in particolare parliamo di innodb?)
7) vai poi con mysqladmin a controllare se ci sono rallentamenti dovuti alla trasmissione dei dati o da un mix di scritture
8) vai di tool ex-percona (cosa sempre buona e giusta)
9) posti qui la query e te la riscrivo. la metto all'ultimo posto perchè non sono più propenso a dare questo genere di aiuti.

PS ovviamente non mi intendo affatto di database mysql con migliaia di utenti e indici così grandi che non stanno nella RAM :)

Kaya
09-01-2017, 07:52
non ne vengo fuori....
1. temo non sia colpa di mysql, se infatti loggo le query lente nessuna supera 1 secondo....
2. non ho capito bene come usarlo, riproverò
3. il gestionale è un programmino in java fatto da un mio amico, gli ho chiesto info ma non ha saputo darmi nemmeno lui indicazioni, è un programma vecchio e non più mantenuto, che comunque ha funzionato benissimo per 10 anni
4. e 6. gli indici ci sono
5. ho fatto qualche tentativo ma non è cambiato nulla

che diavolo sarà cambiato? magari qualcosa in java?
A questo punto ragionerei su una questione di versione java..

mmiat
12-01-2017, 16:09
il db occupa 40MB
la tabella più complessa è rigafattura con 74.000 record
ordine è una tabella da 24.000 record
le tabelle sono innodb
quando ho attivato i log il client è diventato ancora più lento

quanto alle query, le ho loggate tutte e ho visto che quando interrogo un ordine lui lancia qualcosa come una 20ina o più di query, questo perché il programma usa hybernate il quale probabilmente crea chissà quali sovrastrutture

il fatto che siano tante query piccole probabilmente impegna molto la comunicazione tra client e server ?

EDIT: ho installato un xampp e da phpmyadmin > stato ho recuperato un po' di info, mi sono segnato quelle in rosso:

Handler_read_rnd 4,126 Il numero di richieste per leggere una riga basata su una posizione fissa. Questo valore è alto se stai facendo molte richieste che richiedono un ordinamento dei risultati. Probabilmente hai molte query che che richiedono a MySQL di leggere l'intera tabella oppure ci sono dei joins che non usano le chiavi correttamente.
Handler_read_rnd_next 12 k Il numero di richieste per leggere la riga successiva in un file di dati. Questo valore è alto se stai facendo molte scansioni della tabella. Generalmente è un segnale che le tue tabelle non sono correttamente indicizzate, o che le query non sono state scritte per trarre vantaggi dagli indici che hai.
Created_tmp_disk_tables 5 Il numero delle tabelle temporanee create automaticamente sul disco dal server mentre esegue i comandi. Se il valore Created_tmp_disk_tables è grande, potresti voler aumentare il valore tmp_table_size, per fare im modo che le tabelle temporanee siano memory-based anzichè disk-based.
Key_reads 5 Il numero di letture fisiche dal disco di un blocco chiave. Se Key_reads è grande allora il valore key_buffer_size è probabilmente troppo piccolo. IIl rapporto di cache miss rate può essere calcolato come Key_reads/Key_read_requests.
Key_writes 1 Il numero di scritture fisiche di un blocco chiave sul disco.
Opened_tables 36 Il numero di tabelle che sono state aperte. Se il valore opened_tables è grande, probabilmente il valore di table cache è troppo piccolo.

ho provato poi ad aumentare table_cache da 256 a 1024 ma non è cambiato niente