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.mytable
ridurrebbe i file .MYD
e .MYI
per 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 datadir
is /var/lib/mysql
e la tabella mydb.mytable
, sarebbe memorizzato come segue:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Quando OPTIMIZE TABLE mydb.mytable
viene eseguito, mytable.ibd
si restringe.
Solo /var/lib/mysql/mydb/mytable.frm
esisterebbe. Tutti i dati e le pagine di indice per la tabella mydb.mytable
sono memorizzati nel file tablespace di sistema /var/lib/mysql/ibdata1
.
Quando OPTIMIZE TABLE mydb.mytable
viene 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 TABLE
come 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 TABLE
una 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 TABLE
InnoDB in alcuni casi:
OPTIMIZE TABLE
". Quando OPTIMIZE TABLE
esegui una tabella InnoDB, MySQL esegue le operazioni ALTER TABLE ... ENGINE=InnoDB
e 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 TABLE
su InnoDB, il server effettivamente esegue ALTER TABLE ... ENGINE=InnoDB
e ANALYZE TABLE
dietro le quinte prima di restituire quella risposta ... quindi puoi effettivamente eseguire OPTIMIZE TABLE
su 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.