Qual è il modo migliore per INSERIRE un set di dati di grandi dimensioni in un database MySQL (o qualsiasi database in generale)

9

Come parte di un progetto PHP, devo inserire una riga in un database MySQL. Ovviamente sono abituato a farlo, ma ciò ha richiesto l'inserimento in 90 colonne in una query. La query risultante appare orribile e monolitica (in particolare inserendo le mie variabili PHP come valori):

INSERT INTO mytable (column1, colum2, ..., column90) 
VALUES
('value1', 'value2', ..., 'value90')

e sono preoccupato che non sto andando in questo modo nel modo giusto. Mi ci è voluto un lungo (noioso) tempo solo per digitare tutto e testare la scrittura del codice di test sarà altrettanto noioso che temo.

Come fanno i professionisti a scrivere e testare rapidamente queste query? C'è un modo per accelerare il processo?

    
posta Joe 06.09.2011 - 15:50
fonte

9 risposte

7

Joe, il tuo ultimo commento ha spiegato molto. Penso che il vero problema sia la progettazione dei dati. Nuove colonne possono essere necessarie quando il formato del documento cambia, e nella mia esperienza i formati dei documenti tendono a cambiare frequentemente. Invece di una tabella di 90 colonne, con una singola riga per report, memorizzerei i dati del report in una tabella con quattro colonne: report_id, format_id, field_name, field_value. Ogni report sarebbe rappresentato da 90 righe, una per ogni valore di campo nel report. Questo dovrebbe semplificare considerevolmente il tuo codice.

    
risposta data 06.09.2011 - 18:09
fonte
7

In generale, il modo più rapido per caricare un set di dati di grandi dimensioni in un database SQL è utilizzare l'interfaccia di caricamento di massa nativa. Per quanto ne so, ogni dbms SQL ne ha almeno uno.

Documenti MySQL: Uso di Bulk Loader

Se I ha per trasformare un file delimitato da tabulazioni o virgole in istruzioni SQL INSERT, utilizzo awk per leggere il file di input e scrivere il file di output. Non c'è niente di veramente speciale in awk; sembra essere la lingua di elaborazione del testo che conosco meglio. È possibile ottenere gli stessi risultati scrivendo il codice in Perl, Python, Ruby, Rexx, Lisp e così via.

    
risposta data 06.09.2011 - 17:43
fonte
2

Se è possibile ottenere facilmente i nomi delle colonne in un foglio di calcolo Excel, è possibile scrivere macro Excel per produrre codice per varie query e istruzioni DML, quindi incollare i valori in un'altra colonna e l'istruzione di inserimento / aggiornamento viene creata automaticamente. Digitare manualmente è un modo molto lento per farlo, quindi vedi se riesci a trovare i trucchi usando gli strumenti esistenti. Molti editor di testo orientati agli sviluppatori hanno anche la possibilità di registrare e memorizzare macro per rendere i lavori ripetitivi come questi molto più rapidi e semplici.

    
risposta data 06.09.2011 - 16:00
fonte
2

Se hai un file csv, puoi usare CARICARE DATI INFILE ... per importare i dati.

Se devi utilizzare le query "INSERT", fare gli inserimenti in serie velocizzerà il processo. Invece di eseguire una query "INSERT" per ogni singola riga, raggruppa le righe, ad esempio 100 ed esegui la query. Qualcosa del genere:

INSERT INTO theTable (col1, col2, col3,....., col89, col90) 
VALUES
(val11, val12, val13, ........, val189, val190),
(val21, val22, val23, ........, val289, val290),
.......
......
(val101, val102, val103, ........, va1089, val1090);
    
risposta data 12.09.2011 - 20:24
fonte
2

Un modo efficiente per scrivere dati di query a più colonne nel DB MySQL è convertire questi dati in formato JSON o YAML e inserirli come una singola unità. Cambia "scrivi un inserto per una tabella con 90 colonne" in "scrivi un inserto in una tabella con una colonna".

In questo approccio, non tutto deve essere scomposto nei suoi componenti di base e il singolo dato è memorizzato in 1 colonna.

    
risposta data 22.01.2017 - 08:07
fonte
0

Con MySQL puoi usare la sintassi alternativa per le dichiarazioni insert :

insert into table
        set column1 = value1
          , column2 = value2
          , column3 = value3
    
risposta data 12.09.2011 - 14:35
fonte
0

Il tuo scenario si presenta come un'ottima soluzione per una soluzione NoSQL, poiché l'elenco degli attributi può cambiare ogni volta che il formato cambia. Hai valutato altre opzioni rispetto a MySQL? Scava attorno a DynamoDB / MongoDB / Cassandra - potrebbe essere una soluzione migliore.

    
risposta data 17.03.2012 - 17:39
fonte
-1

C'è un modo più efficiente di inserire dati nel database usando php e mysql. Possiamo usare LOAD COMMAND per inserire i dati. Inserisce dati notevolmente veloci.

Per questo creare un file flat (ad esempio, ho usato il file .csv) con i tuoi dati usando la funzione fputcsv() . Quindi inserire i dati usando il comando LOAD. Sincronizza alcuni elementi simili come di seguito:

LOAD DATA LOCAL INFILE "C:/downloads/local/my_data_file.csv"
INTO TABLE  my_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
    
risposta data 17.08.2012 - 15:05
fonte
-1

Prova quanto segue. Ha funzionato per me.

I nomi dei moduli devono essere uguali ai nomi delle colonne del database

Ottieni i valori come di seguito:

foreach ($_GET as $formName => $value) {
    $sql = mysql_query("UPDATE table_name SET $formName = '$value' WHERE ID= $id");
}

Dovrai prima inserire un ID prima del ciclo foreach. puoi ottenere il prossimo id facendo:

SELECT MAX(id) FROM .....

aggiungi 1 all'ID e inseriscilo.

    
risposta data 27.08.2014 - 23:09
fonte

Leggi altre domande sui tag