2011-11-18 11 views
27

voglio raggiungere i seguenti utilizzare il seguente comando per aggiungere una colonna a una tabella esistente:prestazioni di MySQL ALTER TABLE Aggiungi colonna dopo COLONNA - su un grande tavolo

ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column; 

Questa opzione può assumere sostanzialmente più lungo lo stesso comando senza l'opzione AFTER COLUMN, come segue?

ALTER TABLE foo ADD COLUMN bar; 

Il primo comando utilizzerà una quantità maggiore di spazio tabella tmp durante l'esecuzione per eseguire l'azione?

Contesto: ho una tabella molto grande (penso a oltre un miliardo di righe) e voglio aggiungere una colonna aggiuntiva usando l'opzione AFTER COLUMN, ma non voglio essere penalizzata troppo.

+0

è il tavolo letto costantemente?è un tavolo di fusione? –

+0

È un tavolo normale. Non ci sono problemi con la lettura dei dati. – Drew

+0

queste tabelle sono utilizzate in molte procedure mysql? codici php? (o altro codice)? –

risposta

2

Mentre le altre risposte sono utili come esempi della sintassi richiesta per aggiungere colonne a una tabella, la risposta alla domanda reale è stato fornito da NB:


Otterresti un maggiore utilizzo della CPU poiché i record dovrebbero essere spostati.

Dal punto di vista dell'utilizzo della memoria - sarebbe lo stesso con opzione AFTER COLUMN e senza di esso.

Nella maggior parte dei casi, viene creata una tabella tmp. Esistono dei motori MySQL che supportano le hot change dello schema (essendo TokuDB in uno) che non creano la tabella tmp e sprecano tonnellate di risorse.

Tuttavia, se stai facendo questo con MyISAM o InnoDB - Direi che l'opzione "AFTER COLUMN" richiederà un po 'più di tempo a causa dello spostamento dei record.

- N.B.

+0

Potrebbe essere presente un collegamento di alcuni documenti ufficiali per confermarlo? – zhuguowei

36

Ecco cosa farei:

CREATE TABLE newtable LIKE oldtable; 
ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NOT NULL DEFAULT 0; 

Non conosco il tipo di colonna. Do un esempio con INT. Ora qui puoi specificare DOVE vuoi aggiungere questa nuova colonna. Di default lo aggiungerà alla fine a meno che tu non specifichi la parola chiave AFTER, se la fornisci, dovrai specificare nell'ordine che inserirai altrimenti dovrai metterla alla fine.

INSERT INTO newtable SELECT field1, field2, field3 /*etc...*/, newcolumn = 0 FROM oldtable; 

O, se si aggiunge che tra le colonne:

# eg: ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NULL AFTER field2; 
INSERT INTO newtable SELECT field1, field2, newcolumn = 0, field3 /*etc...*/ FROM oldtable; 

è possibile aggiungere una clausola in cui, se si vuole fare loro in batch.

Una volta che tutti i record sono lì

DROP TABLE oldtable; 
RENAME TABLE newtable to oldtable; 
+0

scusa se hai ragione, ho aggiornato la mia anversa –

+1

Questa sarebbe una buona soluzione alternativa. Giusto per condividere: per tutti coloro che adottano questo approccio per le loro tabelle molto grandi, controlla anche eventuali colonne nella tabella interessata che vengono utilizzate come chiavi esterne in altre tabelle. Dovrai resettare anche quelli .. – Nonym

+1

Non vedo come questo sia diverso dal modo in cui MySQL internamente lo fa come descritto qui (http://dev.mysql.com/doc/refman/5.0/en /alter-table-problems.html). Bene, è diverso che tu non faccia i passaggi di ridenominazione. Inoltre, questo approccio non tiene conto delle tabelle che hanno chiavi esterne su oldtable, quindi non sarà possibile rilasciare oldtable se esistessero. Con la domanda, non credo che la risposta dovrebbe presumere che nessuno esiste. – mangoDrunk

11

Creare un altro tavolo e modificare la nuova tabella. (come fece Book Of Zeus)

E usare ALTER TABLE newtable DISABLE KEYS e ALTER TABLE newtable ENABLE KEYS prima e dopo la query di inserimento può renderlo più veloce. (Come di seguito)

CREATE TABLE newtable ....; 
ALTER TABLE newtable ....; 

ALTER TABLE newtable DISABLE KEYS; 
INSERT INTO newtable ....; 
ALTER TABLE newtable ENABLE KEYS; 

DROP TABLE oldtable; 
+3

se lo fai, non dimenticare di ottimizzare il tuo tavolo dopo tutti i tuoi inserti –

+0

@BookOfZeus Qual è lo scopo di 'ottimizzare la tabella' a questo punto? – lqez

+1

Non riesco a spiegarlo meglio di questo: http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html –

Problemi correlati