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 > 0e crea un'istruzione SQL OPTIMIZEsolo 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 OPTIMIZEcomando. Alcuni sostengono che OPTIMIZEnon funzionerà con le tabelle InnoDB e che è necessario eseguirlo ALTER TABLE table_name ENGINE=INNODB. Altri dicono che in OPTIMIZErealtà chiama il ALTER TABLEcomando quando si esegue su tabelle InnoDB. Con questo in mente, ho eseguito il ALTER TABLEcomando su una delle tabelle InnoDB identificate come frammentate ( data_free > 0) e data_freeho 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 NULLe nessuno è stato restituito. Sono tutti maggiori di zero.
Ho anche eseguito il OPTIMIZEcomando su alcune MyISAMtabelle in cui DATA_FREEera 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_tablemostrerai lo stesso valore per ogni tabella nel tablespace condiviso.