¿Cuál es la diferencia entre optimizar tabla y analizar tabla en mysql?

29

¿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.

Booleano
fuente

Respuestas:

28

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;

MyISAM

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:

InnoDB ( innodb_file_per_table habilitado)

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.ibd

Cuando OPTIMIZE TABLE mydb.mytablese ejecuta, mytable.ibdse encoge.

InnoDB ( innodb_file_per_table deshabilitado)

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

Fontanería InnoDB

ACTUALIZACIÓN 2013-02-26 22:33 EST

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:

RolandoMySQLDBA
fuente
Creo que optimizar la tabla para innodb no es compatible. Recibí un mensaje, el índice será recreado. ¿Como funciona?
Booleano
@RolandoMySQLDBA No estoy seguro de qué significa cuando dices "no puedes correr OPTIMIZE TABLE". Cuando usted OPTIMIZE TABLEbusca una tabla InnoDB, MySQL realiza las operaciones ALTER TABLE ... ENGINE=InnoDBy ANALYZE TABLE ...por usted cuando dice "haciendo una tabla recrear + analizar".
Michael - sqlbot
@ Michael-sqlbot Como se muestra en mi respuesta, ejecuté 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;.
RolandoMySQLDBA
Correcto, pero afirmaría que sucedió de inmediato para usted porque la tabla que probó fue muy pequeña. Cuando está OPTIMIZE TABLEen InnoDB, el servidor de hecho se ejecuta ALTER TABLE ... ENGINE=InnoDBy ANALYZE TABLEdetrás de escena antes de devolver esa respuesta ... para que pueda ejecutar OPTIMIZE TABLEInnoDB y lograr el efecto deseado.
Michael - sqlbot
15

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.

Trigo Mitch
fuente