¿Cuál es la diferencia entre optimizar tabla y analizar tabla en mysql? He leído los documentos en línea, pero no estoy seguro de cuál es la diferencia.
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.mytablereduciría los archivos .MYDy .MYIpara 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 datadiris /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.ibdCuando OPTIMIZE TABLE mydb.mytablese ejecuta, mytable.ibdse encoge.
Solo /var/lib/mysql/mydb/mytable.frmexistiría. Todos los datos y las páginas de índice de la tabla mydb.mytablese almacenan en el archivo de espacio de tabla del sistema /var/lib/mysql/ibdata1.
Cuando OPTIMIZE TABLE mydb.mytablese 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 TABLEcomo 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 TABLEuna 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, UPDATEsy 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 TABLEInnoDB en ciertos casos:
OPTIMIZE TABLE". Cuando ustedOPTIMIZE TABLEbusca una tabla InnoDB, MySQL realiza las operacionesALTER TABLE ... ENGINE=InnoDByANALYZE TABLE ...por usted cuando dice "haciendo una tabla recrear + analizar".OPTIMIZE TABLE dat;MySQL 5.5.29 y se quejó de inmediatoTable does not support optimize, doing recreate + analyze instead. Por eso lo recomiendoALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.OPTIMIZE TABLEen InnoDB, el servidor de hecho se ejecutaALTER TABLE ... ENGINE=InnoDByANALYZE TABLEdetrás de escena antes de devolver esa respuesta ... para que pueda ejecutarOPTIMIZE TABLEInnoDB 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.
fuente