Come inserire / aggiornare una grande quantità di dati in mysql usando php

0

Ho un foglio Excel che ha una grande quantità di dati. Sto usando php per inserire i dati nel server mysql.

Ho due problemi

1) Devo aggiornare una riga se l'ID esiste già, altrimenti inserisci i dati.

2) GRANDE PROBLEMA: ho più di 40.000 righe e il timeout sul server sql impostato dall'amministratore è di 60 secondi. Quando eseguo l'aggiornamento / inserimento della query ci vorranno più di 60 secondi, e per questo ci sarà un timeout. Quindi l'intero processo fallirà.

C'è un modo per farlo?

Attualmente sto controllando l'id dello studente se esiste, quindi aggiorna altrimenti inserisco. Questo ritengo che impieghi molto tempo e causi il timeout del server.

Inoltre ho questo campo in mysql che indica l'ultima volta che i dati sono stati aggiornati (last_update). Stavo pensando di usare questa data, e se è passata una data particolare (cioè l'ultima volta che ho eseguito il programma), solo quelle righe dovrebbero essere aggiornate.

Questo aiuterà in ogni caso?

E qual è la query che posso eseguire in modo da controllare questa data nel database mysql, che se è passata una data particolare solo quelle righe devono essere aggiornate e non tutto il resto. (Per favore aiutami con una query di esempio per quanto sopra !!!!!!!!!!!!!!!!!)

    
posta Advait 09.05.2014 - 05:48
fonte

4 risposte

4

Usa la sintassi INSERT ... ON DUPLICATE KEY UPDATE di MySQL gestire automaticamente la logica di inserimento / aggiornamento. 40.000 non sono così tante righe - sarei sorpreso se quel comando richiedesse più di qualche secondo.

Si noti che è possibile inserire più righe contemporaneamente:

INSERT INTO table (id, name) VALUES (id1, name1), (id2, name2), ..., (idN, nameN) ON DUPLICATE KEY UPDATE id=VALUES(id), name=VALUES(name)

Se sei preoccupato di raggiungere un limite di memoria (possibile), prova a caricare le righe in gruppi di poche migliaia alla volta e esegui il ciclo.

    
risposta data 09.05.2014 - 09:50
fonte
2

Rompa la query di grandi dimensioni in query più piccole e cicla su ogni batch. Prova i batch più piccoli richiederà meno di 60 secondi per evitare il rischio di un timeout a causa di un sovraccarico del server, che potrebbe spingere il tempo oltre 60 secondi.

Il controllo dell'ID studente sembra più affidabile rispetto all'utilizzo di un confronto temporale. Sei sicuro di avere un indice sull'ID studente? E lo studente ID utilizza il formato di dati più adatto. per esempio. Utilizza un numero intero se possibile anziché una stringa.

Infine, suppongo che tu non possa richiedere una durata più lunga all'amministratore ... ridurrebbe notevolmente la complessità del codice.

    
risposta data 09.05.2014 - 06:50
fonte
1

Grazie per tutte le tue risposte. Ho finito il mio progetto. Ho trovato un modo per superare tutti questi problemi di memoria, quindi, poiché ho già detto che ho intenzione di ottenere i miei file sotto forma di un foglio Excel. Ed excel può essere facilmente convertito sotto forma di CSV.

Ho usato la funzione LOAD DATA INFILE.

La caratteristica LOAD DATA INFILE usa semplicemente csv e può caricare direttamente l'intero file in un colpo solo e scrivere nuovamente la query & ancora.

Grazie anche a te per aver suggerito INSERT ON KEY DUPLICATE.

Questa risposta ti darà un'idea chiara di ciò che ho fatto. link

    
risposta data 25.05.2014 - 12:28
fonte
-1

Come suggerito in questa risposta puoi usare INSERT ... ON DUPLICATE KEY UPDATE metodo. Ma se hai un numero elevato di colonne con dati pesanti, devi preparare questa query come istruzioni batch e avviare la query una volta preparata.

OR

È possibile creare una singola query di inserimento per riga e attivarla. Ma questo metodo è molto costoso in termini di tempo di esecuzione complessivo dello script e dell'uso della memoria.

    
risposta data 23.05.2014 - 11:57
fonte

Leggi altre domande sui tag