2015-04-21 14 views
5

Ho una tabella di 10000 prodotti nel mio database MySQL. Vorrei aggiornare tutti i record nel modo più veloce. Sto usando Laravel con MySQL.Aggiornamento di una grande tabella MySQL

Per una soluzione migliore, posso anche cambiare le tecnologie. In questo momento ci vuole quasi mezz'ora per aggiornare l'intero tavolo.

Vorrei aggiornare la tabella in modo più rapido. Cosa dovrei fare?

UPDATE

Sto usando il modello laravel come qui di seguito

DB::table('products')->where('product_id',$product_id)->limit(1)->update(array('prodcut_quantity' => $prodcut_quantity)); 
+0

Aggiornare tutti in una dichiarazione? Se stai facendo un singolo aggiornamento alla volta, ci vorranno maledettamente foreveer. – Andrew

+1

Qual è il comando di aggiornamento che si sta utilizzando? –

+0

Mostraci quale codice stai usando in modo che possiamo aiutarti. –

risposta

1

genererei un ciclo che aggiunge la chiave primaria e la quantità di prodotto in una matrice poi fare un DB::insert e immettere un INSERT ON DUPLICATE UPDATE query (ad esempio sotto) sostituendo i valori con quelli negli array:

$array = array(
    '1,1', //product_id,product_quantity 
    '2,2', 
    '4,12', 
); 

DB::insert('INSERT INTO products (product_id,product_quantity) VALUES (' . implode('),(', $array) . ') ON DUPLICATE KEY UPDATE product_quantity=VALUES(product_quantity)'); 

Questa query proverà a INSERT il product_id e product_quantity nella tabella products. Poiché lo product_id esiste già, la query passa a UPDATE, con noi che mappiamo ciò che vogliamo sia la colonna product_quantity.

+1

Nonostante sia la risposta selezionata, questo approccio ** non è ** il modo più veloce per eseguire un aggiornamento utilizzando Laravel (o qualsiasi altra cosa). Chiunque provenga da Google e arrivi a questa risposta dovrebbe avere questo in mente. È anche un anti-pattern completo e aggiunge solo overhead senza motivo, non c'è niente di sbagliato nell'effettuare un semplice aggiornamento e nel wrapping di più di una singola transazione per renderlo più veloce (perché è così che facciamo le cose più velocemente - usiamo un input operazione di output per scrivere un sacco di dati sul disco, ed è per questo che gli hdds vantano una misura di banda larga). –

+0

Grazie @ N.B. per la tua risposta. Potrebbe per favore mostrarci un modo più veloce? –

+0

Se non sbaglio, ci sono due risposte che ti dicono come farlo più velocemente. Inoltre, ci sono commenti che ti dicono come farlo più velocemente. Se stai cercando una soluzione di copia/incolla che puoi usare, temo che non ne avrai una. –

0

Il modo migliore e più veloce è quello di utilizzare il comando update linea singola all'interno della vostra interfaccia di gestione di database (come phpMyAdmin) in in questo modo:

UPDATE product SET ... 

L'ho usato per 1 milione di re cavo prima e ottenere il risultato dopo circa 10 secondi.

+0

Grazie a @hamed per la tua risposta. Stai parlando di costruire una query SQL di aggiornamento utilizzando il ciclo, quindi eseguire quella query? –

+0

Prego. No, non è necessario utilizzare il ciclo. Puoi aggiornare la tabella con ** una sola query ** nell'interfaccia di gestione del database (non all'interno del tuo progetto). – hamed

+0

Ma vorrei aggiornare attraverso il mio progetto. –

2

Le prestazioni sono più spesso influenzate dal design della tabella rispetto all'istruzione che viene eseguita contro di essa. Assicurati che la tabella sia indicizzata correttamente e utilizzi un efficiente motore di archiviazione e assicurati che i tuoi dati siano normalizzati. Come menzionato nei commenti, assicurati di utilizzare una singola query di aggiornamento piuttosto che di più (o almeno alcune affermazioni che puoi usare). Se stai cercando l'ottimizzazione del codice, dovrai postare un po 'per noi con cui lavorare. Se potessi pubblicare i dettagli sul design della tua tabella, sugli indici e sul motore di archiviazione, sarebbe anche di aiuto.

Problemi correlati