LOAD DATA INFILE e INSERT estesi hanno ciascuno i loro vantaggi distinti.
LOAD DATA INFILE è progettato per il caricamento di massa dei dati della tabella in un'unica operazione insieme a campane e fischietti per eseguire suoni come:
- Saltare le linee iniziali
- Saltare colonne specifiche
- Trasformazione di colonne specifiche
- Caricamento di colonne specifiche
- Gestione dei problemi con le chiavi duplicate
Per l'analisi è necessario meno sovraccarico
D'altro canto, se si stanno importando solo 100 righe invece di 1.000.000 di righe, INSERT esteso è ragionevole.
Si noti che mysqldump è stato progettato attorno a INSERT estesi per il gusto di trasportare il design della tabella insieme ai dati mentre esegue l'iniezione di centinaia o migliaia di righe per INSERT. LOAD DATA INFILE crea sempre una dicotomia fisica tra schema e dati.
Dal punto di vista dell'applicazione, LOAD DATA INFILE è anche più insensibile alla modifica dello schema rispetto agli INSERT estesi.
Si può andare avanti e indietro nel bene, nel male e nel brutto di usare LOAD DATA INFILE. Indipendentemente dalla tecnica utilizzata, è sempre necessario impostare bulk_insert_buffer_size . Perché?
Secondo la documentazione MySQL su bulk_insert_buffer_size:
MyISAM utilizza una speciale cache ad albero per rendere più rapidi gli inserimenti di massa per INSERT ... SELECT, INSERT ... VALUES (...), (...), ... e LOAD DATA INFILE quando si aggiungono dati a non vuoto tabelle. Questa variabile limita la dimensione dell'albero della cache in byte per thread. Impostandolo su 0 disabilita questa ottimizzazione. Il valore predefinito è 8 MB.
Per anni, ho visto client dopo client non impostare questo e lasciarlo a 8 MB. Quindi, quando decidono di utilizzare LOAD DATA INFILE o di importare mysqldumps, possono percepire qualcosa di sbagliato. Di solito consiglio di impostarlo su un moderato 256M. In alcuni casi, 512M.
Una volta che hai un buffer INSERT abbastanza grande, l'utilizzo di entrambe le tecniche è reso accademico e si riduce a una scelta personale. Per le applicazioni in cui INSERT in blocco è di appena 100 righe su richiesta, attenersi agli INSERT estesi.
In tutta onestà, dire che LOAD DATA INFILE è più veloce del normale INSERT è una specie di istruzione caricata principalmente perché la configurazione non viene presa in considerazione. Anche se si imposta un benchmark tra LOAD DATA INFILE e INSERT estesi con un bulk_insert_buffer_size corretto, i nanosecondi salvati sull'analisi di ogni riga possono solo produrre risultati nominali al massimo a favore di LOAD DATA INFILE.
Vai avanti e aggiungi questo a my.cnf
[mysqld]
bulk_inset_buffer_size=256M
Puoi anche impostarlo solo per la tua sessione prima di lanciare INSERT estesi
SET bulk_insert_buffer_size= 1024 * 1024 * 256;
AGGIORNAMENTO 2012-07-19 14:58 EDT
Per mantenere le cose in prospettiva, il buffer di inserimento di massa è utile solo per caricare tabelle MyISAM, non InnoDB. Ho scritto un post più recente sul caricamento di massa InnoDB: caricamento Mysql da file bloccato in attesa sul disco rigido
LOAD DATA INFILE
: inserti ad alta velocità con MySQL . In conclusione: è possibile ottenere il 65% delle prestazioniLOAD DATA INFILE
dell'utilizzo di inserti estesi. Ho ottenuto 240.000 inserti / secondo su hardware moderno.