Investigué mucho sobre cómo mantener índices en MySQL para evitar la fragmentación y optimizar de alguna manera la ejecución de algunas consultas.
Estoy familiarizado con esa fórmula que calcula la relación entre el espacio máximo disponible para una tabla VS el espacio utilizado por datos e índices.
Sin embargo, mis preguntas principales siguen sin respuesta. Quizás esto se deba al hecho de que estoy familiarizado con el mantenimiento de índices en SQL Server, y tiendo a pensar que en MySQL debería ser de alguna manera similar.
En el servidor SQL, puede tener varios índices, y cada uno de ellos puede tener diferentes niveles de fragmentación. Luego puede elegir uno y realizar una operación 'REORGANIZAR' o 'RECONSTRUIR' en ese índice en particular, sin afectar el resto.
Que yo sepa, no existe una "fragmentación de la tabla" como tal, y SQL Server no proporciona ninguna herramienta para corregir la "fragmentación de la tabla". Lo que sí proporciona son herramientas para verificar la fragmentación del índice (entendida como la relación entre el número de páginas utilizadas por un índice VS la plenitud de esa página y la contigüidad), así como la fragmentación interna y externa.
Todo eso es bastante sencillo de entender, al menos para mí.
Ahora, cuando llega el turno de mantener índices en MySQL, solo existe el concepto de 'fragmentación de tabla', como se mencionó anteriormente.
Una tabla en MySQL puede tener varios índices, pero cuando compruebo la 'relación de fragmentación' con esa famosa fórmula, no veo la fragmentación de cada índice, sino la tabla en su conjunto.
Cuando quiero optimizar los índices en MySQL, no elijo un índice particular para operar (como en SQL Server). En cambio, hago una operación 'OPTIMIZAR' en toda la tabla, que presumiblemente afecta a todos los índices.
Cuando la tabla está optimizada en MySQL, la relación entre el espacio utilizado por los datos + índices VS el espacio general se reduce, lo que sugiere algún tipo de reorganización física en el disco duro, lo que se traduce en una reducción del espacio físico. Sin embargo, la fragmentación del índice no se trata solo del espacio físico, sino de la estructura del árbol que ha cambiado con el tiempo debido a inserciones y actualizaciones.
Finalmente, obtuve una tabla en InnoDB / MySQL. Esa tabla tiene 3 millones de registros, 105 columnas y 55 índices. Es 1.5GB excluyendo índices, que son 2.1GB.
Esa tabla está siendo golpeada miles de veces al día para actualizar, insertar (en realidad no eliminamos registros).
Esa tabla ha sido creada años atrás y sé con certeza que nadie está manteniendo índices en absoluto.
Esperaba encontrar una gran fragmentación allí, pero cuando realizo el cálculo de fragmentación según lo prescrito
free_space / (data_length + index_length)
Resulta que solo tengo una fragmentación del 0.2%. En mi humilde opinión eso es bastante poco realista.
Entonces las grandes preguntas son:
- ¿Cómo verifico la fragmentación de un índice en particular en MySQL, no en la tabla como un todo?
- ¿OPTIMIZE TABLE realmente soluciona la fragmentación interna / externa de un índice como en SQL Server?
- Cuando optimizo una tabla en MySQL, ¿realmente reconstruye todos los índices en la tabla?
- ¿Es realista pensar que reducir el espacio físico de un índice (sin reconstruir el árbol en sí) se traduce en un mejor rendimiento?