2014-04-24 13 views
5

È più veloce aggiungere o eliminare più colonne in una query anziché eseguire una query per ogni colonna? Ad esempio, è questo:È più veloce modificare più colonne nella stessa query?

ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d; 

più veloce di questo?

ALTER TABLE t2 DROP COLUMN c; 
ALTER TABLE t2 DROP COLUMN d; 
+0

Esegui questa operazione in modo intensivo e sotto carico? –

+0

@Bencaine Importa? Voglio dire quanto spesso hai intenzione di farlo. Quasi mai, giusto? – Strawberry

+1

Misuralo e scopri ... –

risposta

3

Sì, è più veloce. Devi solo effettuare una chiamata all'API del database e solo una volta analizzare la query.

Tuttavia, per le query ALTER TABLE, le prestazioni di solito non sono un problema. Non dovresti farlo frequentemente, solo quando ridisegni lo schema.

Ma se la tua domanda riguardasse le query UPDATE, ad esempio, sarebbe probabilmente significativa. Per esempio. si dovrebbe fare:

UPDATE table 
SET col1 = foo, col2 = bar 
WHERE <condition>; 

piuttosto che

UPDATE table 
SET col1 = foo 
WHERE <condition>; 

UPDATE table 
SET col2 = bar 
WHERE <condition>; 
6

Sì, dovrebbe essere più veloce di eseguire una singola istruzione ALTER TABLE di due.

Nella mia esperienza (con InnoDB su 5.1 e 5.5), MySQL non sembra modificare la tabella "sul posto". MySQL crea effettivamente una nuova tabella, come copia della vecchia tabella con le modifiche specificate.

Due istruzioni separate richiedono che MySQL esegua l'operazione di copia due volte.

Con una sola istruzione, si offre a MySQL l'opportunità di apportare tutte le modifiche con una sola operazione di copia. (Non conosco i dettagli degli interni MySQL, ma è possibile che MySQL faccia effettivamente la copia due volte.)

Altri motori di database (MyISAM et al.) Possono essere elaborati in modo diverso.


Credo che il plugin InnoDB e/o versioni più recenti di InnoDB in MySQL (> 5.5) hanno alcuni algoritmi altri rispetto al metodo "copia", almeno per alcune modifiche, che consentono il tavolo per ancora essere disponibile mentre ALTER TABLE è in esecuzione (per le richieste di lettura). Ma non conosco tutti i dettagli.

Problemi correlati