Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    102

    velocizzare INSERT di MySQL

    Ciao,
    qualcuno sa indicarmi se c'è la possibilità di utilizzare l'INSERT di MySQL ottimizzandolo in velocità?
    Mi spiego. Ho una tabella in lettura di 1.300.000 record che deve essere letta, processata e ricopiata su una seconda tabella. Ho notato però che, mentre l'operazione di lettura impiega solo 3 minuti, quella di scrittura sulla seconda tabella impiega 40 minuti per scrivere soltanto 100.000 record.

    Qualcuno può darmi qualche suggerimento ? Grazie

  2. #2
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310

    Re: velocizzare INSERT di MySQL

    Originariamente inviato da Botola59
    Ciao,
    qualcuno sa indicarmi se c'è la possibilità di utilizzare l'INSERT di MySQL ottimizzandolo in velocità?
    Mi spiego. Ho una tabella in lettura di 1.300.000 record che deve essere letta, processata e ricopiata su una seconda tabella. Ho notato però che, mentre l'operazione di lettura impiega solo 3 minuti, quella di scrittura sulla seconda tabella impiega 40 minuti per scrivere soltanto 100.000 record.

    Qualcuno può darmi qualche suggerimento ? Grazie
    praticamente devi solo copiare il contenuto di una tabella su un altra tabella? Oppure "processare" intendi che fai qualcosa ai dati prima di ricopiarli?
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    102
    In effetti non posso utilizzare il dump di MySQL (se avevi in mente questo). Il file che devo leggere è in origine un TXT e devo gestire le substringhe perchè ci sono campi data scritti in modo diverso per cui devo gestire i byte del file di lettura per poi scriverli nella seconda tabella con un tracciato diverso.

  4. #4
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310
    Originariamente inviato da Botola59
    In effetti non posso utilizzare il dump di MySQL (se avevi in mente questo). Il file che devo leggere è in origine un TXT e devo gestire le substringhe perchè ci sono campi data scritti in modo diverso per cui devo gestire i byte del file di lettura per po scriverli nella seconda tabella con un tracciato diverso.
    ah, ok.. ho capito. Mi sembrava strano, da come avevi scritto prima ti bastava copiare la tabella.. mi spiace, non so aiutarti.
    Aspetta altri pareri.
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  5. #5
    Io riproporrei l'uso di LOAD DATA INFILE ...: l'uso dell'INSERT a questi livelli è molto inefficiente.

    Il tuo file da importare è già testo: si tratta di convertirlo nel formato richiesto, usando PHP o PERL o un filtro specializzato in C se la velocità è così critica, e darlo in pasto a LOAD DATA INFILE...

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    102
    Grazie NTD. Solo ora ho potuto leggere la risposta. Approfondisco lo spunto che mi hai fornito. Eventualmente chiederò chiarimenti. Grazie

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    102
    Originariamente inviato da ntd
    Io riproporrei l'uso di LOAD DATA INFILE ...: l'uso dell'INSERT a questi livelli è molto inefficiente.

    Il tuo file da importare è già testo: si tratta di convertirlo nel formato richiesto, usando PHP o PERL o un filtro specializzato in C se la velocità è così critica, e darlo in pasto a LOAD DATA INFILE...
    Ho letto l'articolo. In realtà non raggiunge lo scopo perchè la mia necessità è di leggere da un file di testo byte per byte, in modo da crearmi dei campi e scrivere il risultato in una tabella. Non posso importare l'intera riga come unico campo.

    Inoltre il file di testo è privo di delimitazioni tra i campi ( ho visto la sintassi dove dice:

    [FIELDS [TERMINATED BY 'string']
    [[OPTIONALLY] ENCLOSED BY 'char']
    [ESCAPED BY 'char']
    ). Manca l'opzione da posizione a posizione

    La gestione che devo fare è quella di una lettura posizionale (esempio da byte 1 a 5 trovo il campo Pippo, da 6 a 15 il campo Pluto ecc.) e trascrivere Pippo e Pluto sulla nuova tabella).

    Fino ad ora faccio tutto leggendo il file di testo da un unico campo con la "substr" di PHP e successivamente trascrivo il risultato nella nuova tabella con "INSERT INTO". Ma è proprio questo comando che rallenta e proprio per questo pensavo esistesse qualche alternativa.

    Grazie e scusa se sono stato un po' confusionario.

  8. #8
    Non intendevo importare direttamente il tuo file (chiamiamolo 'botola.txt'): intendevo crearne un altro adatto (chiamiamolo 'ntd.txt') e importarlo con LOAD DATA INFILE. Anche se a prima vista può sembrarti un'operazione in più, in realtà è molto più veloce (elimina l'overhead del parsing del comando 'INSERT').

    Codice PHP:
    function converti($text) {
       
    // Esempio di conversione
       
    $nome trim(substr($text010));
       
    $cognome trim(substr($text1020));
        return 
    "$nome\t$cognome\n";
    }

    $from fopen('botola.txt''rb');
    $to fopen('ntd.txt''wb');

    while (!
    feof($from)) {
        
    $in fgets($from);
        
    $out converti($in);
        
    fwrite($to$out);
    }

    fclose($from);
    fclose($to);

    mysql_query('LOAD DATA INFILE \'ntd.txt\' INTO TABLE `chenneso`'); 

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    102
    Grazie ancora Nicola.

    Faccio delle prove sulla mia applicazione.

    Sai se la stessa procedura di scrittura si può applicare anche su tabelle MySQL e non solo su txt o csv ?

    Ciao

  10. #10
    Originariamente inviato da Botola59
    Sai se la stessa procedura di scrittura si può applicare anche su tabelle MySQL e non solo su txt o csv ?
    Se intendi copiare una tabella MySQL in un'altra manipolandone i dati, sarei più propenso a usare un INSERT... SELECT ... studiato ad hoc: per grande che sia, questo comando SQL difficilmente sarà più grande di 1Kb e quindi l'overhead del parser sarà minimo (a differenza del tuo INSERT originale di 1.300.000 records, dove l'overhead del parser è enorme).

    Se la manipolazione da effettuare è estremamente complessa, può però risultare sconveniente l'SQL: a mali estremi, estremi rimedi.

    Bisognerebbe valutare caso per caso.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.