Risposte:
Per espandere la risposta di @ MitchWheat (+1 per la prima risposta diretta):
TABELLA ANALISI esamina la distribuzione delle chiavi e le memorizza in INFORMATION_SCHEMA.STATISTICS .
OPTIMIZE TABLE esegue ANALYZE TABLE dopo aver eseguito la compressione della tabella. L'equivalente diOPTIMIZE TABLE mydb.mytable;se la tabella fosse MyISAM è questo:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Per la tabella MyISAM mydb.mytable in datadir /var/lib/mysql, sono disponibili i seguenti file:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.MYD (dati)/var/lib/mysql/mydb/mytable.MYI (indici)OPTIMIZE TABLE mydb.mytableridurrebbe i file .MYDe .MYIper la tabella.
Questo non è lo stesso per InnoDB. Ecco come è diverso:
I dati e gli indici di ogni tabella sono memorizzati in un file tablespace esterno. Per datadiris /var/lib/mysql e la tabella mydb.mytable, sarebbe memorizzato come segue:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.ibdQuando OPTIMIZE TABLE mydb.mytableviene eseguito, mytable.ibdsi restringe.
Solo /var/lib/mysql/mydb/mytable.frmesisterebbe. Tutti i dati e le pagine di indice per la tabella mydb.mytablesono memorizzati nel file tablespace di sistema /var/lib/mysql/ibdata1.
Quando OPTIMIZE TABLE mydb.mytableviene eseguito, le pagine dei dati e dell'indice vengono scritte contigue in ibdata1. Sfortunatamente, questo fa crescere ibdata1 a passi da gigante.
Vedere la Rappresentazione pittorica del CTO di Percona Vadim Tkachenko
Il tuo commento è stato
Penso che l'ottimizzazione della tabella per innodb non sia supportata. Ho ricevuto un messaggio, l'indice verrà ricreato. Come funziona?
L'ho provato
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
Hai ragione. Non è possibile eseguire OPTIMIZE TABLEcome singola operazione. Quello che fa InnoDB invece è il seguente:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Puoi anche eseguire questi passaggi da solo.
Tuttavia, in tutta onestà, non è necessario eseguire ANALYZE TABLEuna tabella InnoDB poiché ogni volta che viene eseguita una query, il motore di archiviazione InnoDB esegue una stima sulla cardinalità della tabella in base al passaggio tra le pagine degli indici. Se ci sono un elevato numero di INSERTs, UPDATEs, e DELETEs, quindi sarà necessario ANALYZE TABLE. Quando è presente un numero elevato di DELETEs, ALTER TABLE mydb.mytable ENGINE=InnoDB;è necessario ridurre la tabella.
In realtà ho scritto post sulla futilità di ANALYZE TABLEInnoDB in alcuni casi:
OPTIMIZE TABLE". Quando OPTIMIZE TABLEesegui una tabella InnoDB, MySQL esegue le operazioni ALTER TABLE ... ENGINE=InnoDBe ANALYZE TABLE ...per te quando dice "facendo invece ricreare + analizza tabella".
OPTIMIZE TABLE dat;MySQL 5.5.29 e si è subito lamentato Table does not support optimize, doing recreate + analyze instead. Ecco perché lo consiglio ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
OPTIMIZE TABLEsu InnoDB, il server effettivamente esegue ALTER TABLE ... ENGINE=InnoDBe ANALYZE TABLEdietro le quinte prima di restituire quella risposta ... quindi puoi effettivamente eseguire OPTIMIZE TABLEsu InnoDB e ottenere l'effetto desiderato.
Dipende dalla tua versione di MySQL e dal motore di archiviazione, ma in generale:
OTTIMIZZA TABELLA Analizza la tabella, memorizza la distribuzione delle chiavi per una tabella, recupera lo spazio inutilizzato e deframmenta il file di dati.
TABELLA ANALISI Analizza solo la tabella e memorizza la distribuzione delle chiavi.