Ho studiato come ottimizzare solo le tabelle frammentate in MySQL e ho esaminato questo post sull'ottimizzazione delle tabelle . Fondamentalmente esegue una query sul database information_schema per qualsiasi tabella con data_free > 0
e crea un'istruzione SQL OPTIMIZE
solo per quelle tabelle. Ho eseguito questa query e identificato 148 tabelle per l'ottimizzazione. Tutte le tabelle identificate sono tabelle InnoDB. Dopo aver eseguito lo script SQL di ottimizzazione risultante, ho eseguito nuovamente lo script originale per identificare le tabelle frammentate e ha restituito le stesse tabelle esatte durante il primo passaggio.
Ho visto messaggi contrastanti riguardanti le tabelle InnoDB e il OPTIMIZE
comando. Alcuni sostengono che OPTIMIZE
non funzionerà con le tabelle InnoDB e che è necessario eseguirlo ALTER TABLE table_name ENGINE=INNODB
. Altri dicono che in OPTIMIZE
realtà chiama il ALTER TABLE
comando quando si esegue su tabelle InnoDB. Con questo in mente, ho eseguito il ALTER TABLE
comando su una delle tabelle InnoDB identificate come frammentate ( data_free > 0
) e data_free
ho scoperto che in seguito non è cambiato. È ancora maggiore di 0. Ho anche riavviato MySQL e l'ho controllato solo per trovare gli stessi risultati.
Ora, abbiamo diversi server che eseguono MySQL 5.5.29 nella nostra organizzazione e ho eseguito una query su tutti loro per identificare qualsiasi tabella InnoDB con DATA_FREE=0 or NULL
e nessuno è stato restituito. Sono tutti maggiori di zero.
Ho anche eseguito il OPTIMIZE
comando su alcune MyISAM
tabelle in cui DATA_FREE
era maggiore di zero e in seguito ho verificato che fosse zero.
Qualcuno può far luce su questo per me? Qual è il metodo corretto per rimuovere la frammentazione dalle tabelle InnoDB? Qual è il metodo corretto per determinare le tabelle frammentate di InnoDB?
Grazie
innodb_file_per_table
mostrerai lo stesso valore per ogni tabella nel tablespace condiviso.