Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

di il
5 risposte

Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

Salve a tutti.

Dopo aver fatto vari tentativi nella costruzione di una query, finalmente riesco a trovare una query “killer” per la sua velocità.

La prima volta che viene eseguita ci mette un po' di tempo (anche 50/60 secondi), cmq accettabile su 2.000.000 di record, le esecuzioni successive ci mette meno di un secondo.

Se chiudo il programma e lo riapro…50/60 secondi e poi un secondo…mha!

Questo comportamento lo fa solo sul pc del cliente.

Qualcuno, per cortesia, potrebbe darmi qualche spiegazione ?

Grazie

5 Risposte

  • Re: Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

    Non sappiamo manco qual è la query…… :/

  • Re: Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

    60 secondi per 2 milioni di record E ASSURDO! 

    Io ho una tabella da 10 MILIARDI di record e sta una manciata di secondi. 

    ---

    La tua query e' progettata male E mancano gli indici.

    Ovviamente questo e' il motivo nel 99% dei CASI. 

    Usa il QUERY PLAN 

    https://dev.mysql.com/doc/refman/8.0/en/execution-plan-information.html 

    per capire dove perde tempo: le parole MAGGGICCCHE che NON DEVONO ESSERE PRESENTI sono  … rullo di tamburi … “Full Scan”  !

    ---

    Il perche' la prima volta e' lenta e poi veloce e' BANALE: uso della cache e la cache dipende dalla connessione.

    Fai in modo che la query abbia una parte VARIABILE, cioe' che cambia ogni volta che la invochi, vedrai che in questo modo impieghera' sempre 60 s.

  • Re: Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

    Si, scusate, siccome la query è davvero banale non pensavo che fosse importante (errore mio)…eccola :

     select CONCAT(`Codice Cliente`,'*',ifnull(Codice_Periferia,'')) as `Codice`,
    `Nominativo`,trim(concat(ifnull(`Indirizzo`,''),' ',ifnull(`Numero Civico`,''),if(Ifnull(Esponente,'')='','',concat('/',Esponente)))) as Indiriz,Cap
    Citta,Provincia, Frazione, ifnull(Nazione,'') as Nazione 
    from clienti
    where Nominativo like 'A%' And ifnull(Citta,'')<>'' 
    and Convert(ifnull(Cap,'0'),UNSIGNED)>0 
    and IfNull(Indirizzo,'')<>''

    Il db è MyIsam

    ovviamente gli indici ci sono. Sia sul codice cliente (Key Btree) che sul campo ID (Primary) ed anche sul campo nominativo (Key Btree)

    Il problema è che sul mio pc ci mette sempre lo stesso tempo (molto veloce max 10 secondi), sul pc del cliente…la prima volta ci mette qualche secondo (40/50), poi è quasi immediata, anche se cambio la query (per esempio Citta='Milano', oppure Nominativo Like ‘B%’ anzichè ‘A%’). Mentre se chiudo il programma e lo riavvio…si ripete lo scenario, la prima interrogazione ci mette un po' mentre le altre sono quasi immediate.

    Il perche' la prima volta e' lenta e poi veloce e' BANALE: uso della cache e la cache dipende dalla connessione.

    Potresti darmi qualche consiglio su come configurarlo al meglio?

    Io ho una tabella da 10 MILIARDI di record e sta una manciata di secondi. 

    Woow. Hai una configurazione particolare del file di setup di MySql?

    Vi ricordo che uso vbnet 2019.

  • Re: Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

    Nessuna configurazione particolare SOLO fatto gli indici giusti.

    TUTTI il tuo problema sta QUI

    where Nominativo like 'A%' And ifnull(Citta,'')<>'' 
    and Convert(ifnull(Cap,'0'),UNSIGNED)>0 
    and IfNull(Indirizzo,'')<>''

    Questa condizione e' da “DEFENESTRAZIONE dal 28-mo piano” e SENZA paracadute!

    1. questa condizione OBBLIGA a fare un FULLSCAN della tabella. NON SI FA
    2. al posto della ‘like’ usa un indice FULLTEXT (https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html )
    3. nella WHERE EVITA  COME LA LEBBRA la funzione “ifnull()” ed USA il predicato “IS NULL”, 

    .

    Per essere precisi: non si fa A MENO CHE non sia usata in una funzionalita' di servizio/manutenzione, eseguita saltuariamente e per cui i tempi di esecuzione non sono un problema.

    SE la condizione su nominativo e' sempre presente, l'indice fulltext dovrebbe ridurre i tempi a MENO DI UN SECONDO.

    ---

    Per la cache: NON TOCCARE NULLA!

    Per 2 milioni di record (praticamente un piccolo topolino rispetto a quello che puo' fare MySQL) non serve.

    ---

    Per i problemi sul PC del cliente: 

    BOH! Strano!

    Problemi di rete?

    ---

    Regola aurea: TUTTE LE QUERY dovrebbero stare (MOOOOLTO) MENO DI UN SECONDO.

    Ma come tutte le regole, esistono le eccezzioni ;-)

  • Re: Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

    Ti ringrazio per avermi risposto.

    Mi documenterò.

    Grazie ancora (a tutti).

Devi accedere o registrarti per scrivere nel forum
5 risposte