2010-01-18 24 views
13

Ho una tabella di 12 GB piena di immagini, sto cercando di rinominare la colonna blob che contiene i dati, e ci sta mettendo per sempre. Qualcuno può darmi un colpo in base al motivo per cui ci vuole così tanto tempo per rinominare la colonna? Avrei pensato che questa operazione sarebbe stata abbastanza veloce, indipendentemente dalle dimensioni del tavolo?Perché ci vuole così tanto tempo per rinominare una colonna in mysql?

EDIT: La query mi sono imbattuto è il seguente

alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL 

Sembra che la maggior parte del tempo viene speso in attesa di mysql per creare una copia temporanea della tabella immagini, che dal momento che è molto grande sta prendendo un po 'di tempo da fare.

È presente nell'elenco delle cose da fare, per modificare la memorizzazione delle immagini dal database al filesystem.

EDIT2: Mysql versione Server: 5.0.51a-24 + lenny2 (Debian)

+1

potrebbe essere una buona idea di inviare la query esatto è stato eseguito. – nos

+1

forse è per questo che le domande che ho visto su come memorizzare le immagini in un DB * di solito * dicono 'archiviano le immagini nel filesystem e si collegano alle immagini nel DB.' – pavium

+0

@Janak: quale versione di MySQL stai usando? – outis

risposta

10

Non riesco a darvi il blow-by-blow (la richiesta di funzionalità #34354 sarebbe d'aiuto, tranne che probabilmente non verrebbe reindirizzato a MySQL 5.0), ma il tempo extra è dovuto al fatto che un ALTER ... CHANGE può modificare il tipo di colonna (e gli attributi di colonna, se presenti), che richiede la conversione dei valori memorizzati nella colonna e altri controlli. MySQL 5.0 non include le ottimizzazioni per quando il nuovo tipo e gli attributi sono gli stessi del vecchio. Dalla documentazione per ALTER in MySQL 5.0:

Nella maggior parte dei casi, ALTER TABLE funziona eseguendo una copia temporanea della tabella originale. La modifica viene eseguita sulla copia, quindi la tabella originale viene cancellata e la nuova viene rinominata. Mentre ALTER TABLE è in esecuzione, la tabella originale è leggibile da altre sessioni. Gli aggiornamenti e le scritture sulla tabella sono bloccati finché la nuova tabella non è pronta e quindi vengono automaticamente reindirizzati alla nuova tabella senza aggiornamenti non riusciti.

[...]

Se si utilizza qualsiasi opzione per ALTER TABLE diverso RENAME, MySQL crea sempre una tabella temporanea, anche se i dati non sarebbero strettamente necessario copiare (come ad esempio quando si cambia il nome di una colonna).

Sotto 5.1, ALTER ha alcune ottimizzazioni aggiuntive:

In alcuni casi, nessuna tabella temporanea è necessario:

  • alterazioni che modificano solo i metadati tavolo e non dati della tabella può essere fatto immediatamente modificando il file .frm della tabella e non toccando il contenuto della tabella.Le seguenti modifiche sono alterazioni veloci che possono essere fatte in questo modo:

    • Rinominare una colonna, eccezione del motore di memorizzazione InnoDB.

[...]

+6

Rinominare una colonna, ad eccezione del motore di archiviazione InnoDB. :( – pjb3

+0

Buon punto pjb3 Non sono sicuro se è cambiato dal post originale, ma ho modificato la risposta per riflettere la documentazione di MySQL Come dici tu, questa tecnica NON sembra essere supportata per innodb – DougW

+0

Mi rendo conto che hai postato questa risposta nel 2010, ma da allora MySQL 5.6 ha aggiunto un sacco di nuovi casi in cui può fare ALTER sul posto. Vedi http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl. html –

7

Perché MySQL ricostruirà l'intera tabella quando si apportano le modifiche dello schema.

Questo perché è l'unico modo per farlo in alcuni casi, e rende molto più facile per il server ricostruirlo comunque.

2

Sì mysql esegue una copia temporanea della tabella. Non penso che ci sia un modo semplice per aggirare ciò. Dovresti davvero pensare a memorizzare le immagini sul filesystem e memorizzare solo i percorsi in mysql. Questo è l'unico modo per fissarlo, suppongo.

Problemi correlati