Beneficios de ejecutar OPTIMIZE TABLE Query en MySQL DB Server

9

Me gustaría saber cuáles son los beneficios [realmente prácticos] que se pueden obtener al ejecutar la OPTIMIZE TABLE tbl_nameconsulta en MySQL Server.

Verifiqué esto una vez y descubrí que después de ejecutarlo, el siguiente hit de la base de datos lleva mucho tiempo debido a la reubicación de fragmentos más o menos, pero los hits posteriores muestran algún tipo de rendimiento, no estoy seguro de si el almacenamiento en caché de consultas hace este truco con la optimización o solo la optimización hace este truco.

¿Puede alguien guiarme con algunos valores reales de diferencia de rendimiento, si es posible, para poder seguir adelante ya que trabajar con MySQL está ganando gravedad en nuestro proyecto?

Saravanan
fuente

Respuestas:

7

Tenga en cuenta que OPTIMIZE TABLE no realiza la desfragmentación. Internamente, OPTIMIZE TABLE realiza varias operaciones (copiar datos a un archivo temporal, volver a crear índices, recalcular estadísticas de índice). De hecho, el ejemplo que tengo se puede realizar manualmente como se muestra.

Ejemplo: si optimiza mydb.mytable, ingrese este comando:

OPTIMIZE TABLE mydb.mytable;

Tenga en cuenta que mysql realiza algo de lo siguiente bajo el capó:

CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;

Esto es bastante útil para tablas que experimentan un alto volumen de ACTUALIZACIONES y DELETES

Realizar esto puede lograr dos cosas

  1. Evite que mysql mire a través de fragmentos en una tabla en un intento de cargar datos en los fragmentos del tamaño correcto. Eliminar estos fragmentos reducirá esta operación.

  2. Tener las estadísticas de índice recalculadas ayuda al MySQL Query Optimizer a construir mejores planes EXPLAIN. De lo contrario, las consultas pueden deteriorarse en el tiempo de ejecución porque MySQL Query Optimizer decidió hacer malas suposiciones sobre el plan EXPLAIN. Este sería un síntoma definitivo de una tabla que ha tenido un alto volumen de ACTUALIZACIONES y DELETES.

CONSIDERACIÓN

Con respecto al almacenamiento en caché, el almacenamiento en caché se sumerge rápidamente debido a un escaneo completo de la tabla. Para las páginas de índice MyISAM, ingrese y salga de MyISAM Key Cache. Para InnoDB, las páginas de datos e índices entran y salen del InnoDB Buffer Pool.

RolandoMySQLDBA
fuente
Gracias por su respuesta. Desde su punto de vista, entiendo que mejor uso algún servicio como un trabajo cron para programar la optimización de la tabla para una de mis tablas que se actualizan con frecuencia para poder lograr un mejor rendimiento. Además de esto, estoy usando InnoDB para esta tabla. ¿Es esta una mejor opción? Además, encuentro que HASH se une en SQL Server, que se sugirió para mejorar un poco el rendimiento de las consultas, ¿podría explicarme esto y cómo obtener uno similar en MySQL? También, por favor, deme un optimizador de consultas SQL para MySQL [versión Windows7].
Saravanan
@savaranan: El Optimizador de consultas MySQL al que me refería era el interno integrado en MySQL. Por cierto, dado que la tabla que desea optimizar es InnoDB, puede omitir los pasos DISABLE KEYS y ENABLE KEYS. Además, ANALYZE TABLE se puede omitir porque es totalmente inútil en las tablas de InnoDB ya que InnoDB recalcula sus cardinalidades de tabla mediante aproximaciones cercanas utilizando las páginas de los índices BTREE, conocidas como inmersiones de índice.
RolandoMySQLDBA
@savaranan: en lo que respecta a los índices HASH, InnoDB tiene índices hash adaptativos ( dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html ). También hay buenas sugerencias para emular sus propios índices hash y manejar colisiones basadas en las páginas 103-106 de "High Performance MySQL" ( amazon.com/dp/0596101716 )
RolandoMySQLDBA