Respuestas:
Para ampliar la respuesta de @ MitchWheat (+1 por responder directamente primero):
ANALYZE TABLE examina la distribución de claves y las almacena en INFORMATION_SCHEMA.STATISTICS .
OPTIMIZE TABLE realiza ANALYZE TABLE después de hacer algo de compresión de la tabla. El equivalente deOPTIMIZE TABLE mydb.mytable;
si la tabla era MyISAM es esta:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Para la tabla MyISAM mydb.mytable en datadir /var/lib/mysql
, tiene los siguientes archivos:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(datos)/var/lib/mysql/mydb/mytable.MYI
(índices)OPTIMIZE TABLE mydb.mytable
reduciría los archivos .MYD
y .MYI
para la mesa.
Esto no es lo mismo para InnoDB. Así es como es diferente:
Los datos e índices de cada tabla se almacenan en un archivo de espacio de tabla externo. Para datadir
is /var/lib/mysql
y la tabla mydb.mytable
, se almacenaría de la siguiente manera:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Cuando OPTIMIZE TABLE mydb.mytable
se ejecuta, mytable.ibd
se encoge.
Solo /var/lib/mysql/mydb/mytable.frm
existiría. Todos los datos y las páginas de índice de la tabla mydb.mytable
se almacenan en el archivo de espacio de tabla del sistema /var/lib/mysql/ibdata1
.
Cuando OPTIMIZE TABLE mydb.mytable
se ejecuta, las páginas de datos e índices se escriben contiguamente en ibdata1. Desafortunadamente, esto hace que ibdata1 crezca a pasos agigantados.
Vea la representación pictórica del CTO de Percona Vadim Tkachenko
Tu comentario fue
Creo que optimizar la tabla para innodb no es compatible. Recibí un mensaje, el índice será recreado. ¿Como funciona?
Probé esto
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>
Estás en lo correcto. No puede ejecutarse OPTIMIZE TABLE
como una sola operación. Lo que InnoDB hace es lo siguiente:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
También puede ejecutar estos pasos usted mismo.
Sin embargo, con toda honestidad, no debería tener que ejecutar ANALYZE TABLE
una tabla de InnoDB porque cada vez que se ejecuta una consulta, el motor de almacenamiento de InnoDB realiza una estimación de la cardinalidad de la tabla en función del paso por las páginas de los índices. Si hay un alto número de INSERTs
, UPDATEs
y DELETEs
, a continuación, usted necesita ANALYZE TABLE
. Cuando hay un gran número de DELETEs
, entonces ALTER TABLE mydb.mytable ENGINE=InnoDB;
es necesario reducir la tabla.
De hecho, escribí publicaciones sobre la inutilidad de ANALYZE TABLE
InnoDB en ciertos casos:
OPTIMIZE TABLE
". Cuando usted OPTIMIZE TABLE
busca una tabla InnoDB, MySQL realiza las operaciones ALTER TABLE ... ENGINE=InnoDB
y ANALYZE TABLE ...
por usted cuando dice "haciendo una tabla recrear + analizar".
OPTIMIZE TABLE dat;
MySQL 5.5.29 y se quejó de inmediato Table does not support optimize, doing recreate + analyze instead
. Por eso lo recomiendo ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
.
OPTIMIZE TABLE
en InnoDB, el servidor de hecho se ejecuta ALTER TABLE ... ENGINE=InnoDB
y ANALYZE TABLE
detrás de escena antes de devolver esa respuesta ... para que pueda ejecutar OPTIMIZE TABLE
InnoDB y lograr el efecto deseado.
Depende de su versión de MySQL y del motor de almacenamiento, pero en general:
OPTIMIZE TABLE Analiza la tabla, almacena la distribución de claves para una tabla, recupera el espacio no utilizado y desfragmenta el archivo de datos.
ANALIZAR TABLA Solo analiza la tabla y almacena la distribución de claves.