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. Sono ovviamente abituato a farlo, ma ciò ha richiesto l'inserimento in 90 colonne in una query. La query risultante sembra 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 anche molto tempo (noioso) solo per scrivere tutto e testare la scrittura del codice di test sarà altrettanto noioso, temo.

In che modo i professionisti possono scrivere e testare rapidamente queste query? C'è un modo per accelerare il processo?


2
Sono più preoccupato che la tabella abbia 90 colonne rispetto alla banale quantità di tempo impiegata a digitare i nomi delle colonne. (A proposito trascino tutte le colonne contemporaneamente in SQL Server, non c'è posto per fare lo stesso in mySQL o PHP? Vorrei vedere se riesci a trovare che semplifica la vita in quanto non ci sono errori di battitura.)
HLGEM,

1
So che 90 colonne sono molte, ma ogni colonna si riferisce a un singolo campo per un documento pdf che devo compilare e non vedo il punto di romperlo, o come lo farei. Grazie per le informazioni su SQL Server. Non sono sicuro di cosa tu voglia dire trascinando le colonne ma darò un'occhiata.
Joe,

1
Scrivi un'istruzione select che elenca tutte le colonne in una determinata tabella e vai da lì.
JeffO,

Jeff O: L'ho usato anche io, può essere una tecnica molto potente se fatto bene. Dovresti postarlo come risposta se puoi dare un esempio di codice!
FrustratedWithFormsDesigner,

Risposte:


7

Joe, il tuo ultimo commento ha spiegato molto. Penso che il vero problema sia la progettazione dei dati. Potrebbero essere necessarie nuove colonne quando il formato del documento cambia e, nella mia esperienza, i formati del documento tendono a cambiare frequentemente. Invece di una tabella a 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 rapporto verrebbe rappresentato da 90 righe, una per ogni valore di campo nel rapporto. Questo dovrebbe semplificare notevolmente il tuo codice.


Grazie per la tua risposta. Tutti i campi (a parte l'indice) sono VARCHARS, quindi funzionerebbe per me (e potrei comunque convertire altri valori). Potrei sprecare molto spazio, perché dovrei avere la dimensione della colonna field_value impostata sul valore più grande (lungo circa 256 caratteri) mentre alcuni campi richiedono solo una lunghezza di 3. Sarebbe sicuramente più facile da usare e posso capire come sarebbe più prova per il futuro come hai descritto.
Joe,

4
FWIW, la maggior parte dei sistemi di database utilizza solo lo spazio necessario per archiviare i dati. Quindi se memorizzi solo 3 caratteri in un campo VARCHAR (256), ci vorranno solo 3 byte, non 256. Non so molto sugli interni di MySQL, ma sarei sorpreso se riempissero completamente i loro campi dimensione dichiarata.
TMN,

@TMN Ecco cosa significa VAR in VARCHAR! Lunghezza variabile Char. Questa è una funzione (o la definizione) del tipo di dati, non del sistema DB. Inoltre, poiché VARCHAR è a lunghezza variabile, il DB deve conoscere la lunghezza di ciascun valore, quindi memorizza la lunghezza come metadati. Ciò significa spazio di archiviazione ambientale! Quindi un VARCHAR (1) utilizza effettivamente 3 byte di dati a causa del sovraccarico, 3 volte tanto quanto un Char (1)!
Morons,

2
-1, non sono d'accordo con questa risposta, in questo caso stai meglio con 90 colonne. Se l'entità ha 90 punti dati, così sia, mantieni i tuoi dati razionali.
Morons,

@TMN solo per chiarire il mio punto, ha detto "Quindi se memorizzi solo 3 caratteri in un campo VARCHAR (256), ci vorranno solo 3 byte" La verità è che occuperà 5 byte non 3.
Morons,

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: utilizzo di Bulk Loader

Se io devo trasformare un tabulazioni o file delimitato da virgole in istruzioni SQL INSERT, utilizzare awk per leggere il file di input e scrivere il file di output. Non c'è niente di veramente speciale in Awk; capita solo di essere il linguaggio di elaborazione del testo che conosco meglio. Puoi ottenere gli stessi risultati scrivendo il codice in Perl, Python, Ruby, Rexx, Lisp e così via.


2
Il caricamento collettivo è davvero la strada da percorrere se devi inserire un gran numero di righe, ma in questo caso sta solo inserendo una singola riga con molte colonne. Il caricamento collettivo non sarà di aiuto e probabilmente richiederà la scrittura di più codice rispetto all'approccio diretto.
TMN,

-1, a questa risposta manca completamente il punto della domanda
Doc Brown,

2

Se riesci a ottenere facilmente i nomi delle colonne in un foglio di calcolo Excel, puoi scrivere macro Excel per produrre codice per varie query e istruzioni DML, quindi incollare i valori in un'altra colonna e l'istruzione insert / update viene creata automaticamente per te. La digitazione manuale è un modo molto lento per farlo, quindi vedi se riesci a trovare trucchi usando gli strumenti esistenti. Molti editor di testo orientati agli sviluppatori hanno anche la possibilità di registrare e archiviare macro per rendere i lavori ripetitivi come questo molto più veloci e facili.


2

Se si dispone di un file CSV, è possibile utilizzare LOAD DATA INFILE ... per importare i dati.

Se devi utilizzare le query "INSERT", eseguire inserimenti di massa accelererà il processo. Invece di eseguire una query "INSERT" per ogni singola riga, raggruppare le righe, dire 100 ed eseguire la query. Qualcosa come questo:

INSERT INTO theTable (col1, col2, col3,....., col89, col90) 
VALUES
(val11, val12, val13, ........, val189, val190),
(val21, val22, val23, ........, val289, val290),
.......
......
(val101, val102, val103, ........, va1089, val1090);

2

Un modo efficace per scrivere una query su più colonne nel database MySQL è convertire questi dati nel 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 suddiviso nei suoi componenti di base e il singolo dato viene archiviato in una sola colonna.


@gnat: offre una soluzione alternativa. Cambia "scrivi un inserto per una tabella con 90 colonne" in "scrivi un inserto in una tabella con una colonna". Dato il problema come descritto, è una soluzione valida. Non tutto deve essere suddiviso nei suoi componenti di base. L'unica altra risposta simile, ha suggerito di completare NoSQL, eliminando completamente il database SQL, che è eccessivo. Questa risposta afferma che è possibile utilizzare un approccio misto. Crea solo 1 colonna per questo singolo dato. Considera che l'alternativa potrebbe essere avere una colonna binaria e archiviare l'intero pdf.
jmoreno,

@gnat: darò a Noviff la possibilità di dirlo con parole sue ...
jmoreno,

@ moscerino e jmoreno - grazie per i tuoi commenti. Mi piace il chiarimento di Gnat sulla mia risposta e ho modificato la risposta in base al suo chiarimento.
Noviff

0

Con MySQL è possibile utilizzare una sintassi alternativa per le insertdichiarazioni:

insert into table
        set column1 = value1
          , column2 = value2
          , column3 = value3

1
È davvero più veloce?
Pacerier,

@Pacerier No, non è più veloce. Solo un'altra sintassi.
Kaspars Foigts,

0

Lo scenario sembra un'ottima soluzione per una soluzione NoSQL, poiché l'elenco degli attributi può cambiare in qualsiasi momento il formato cambia. Hai valutato altre opzioni oltre a MySQL? Scava intorno a DynamoDB / MongoDB / Cassandra - potrebbe essere una soluzione migliore.


-1

Esiste un modo più efficiente per inserire dati nel database usando php e mysql. Possiamo usare LOAD COMMAND per inserire i dati. Inserisce i dati molto velocemente.

Per questo creare un file flat (ad esempio ho usato il file .csv) con i tuoi dati usando la fputcsv()funzione. Quindi inserire i dati utilizzando il comando LOAD. Sintassi qualcosa di simile 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;

-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 a id e inseriscilo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.