J'ai fait beaucoup de recherches sur la façon de maintenir les index dans MySQL pour éviter la fragmentation et optimiser en quelque sorte l'exécution de certaines requêtes.
Je connais cette formule qui calcule le rapport entre l'espace maximum disponible pour une table VS l'espace utilisé par les données et les index.
Cependant, mes principales questions restent sans réponse. Cela est peut-être dû au fait que je connais la maintenance des index dans SQL Server, et j'ai tendance à penser que dans MySQL, cela devrait être en quelque sorte similaire.
Dans SQL Server, vous pouvez avoir plusieurs index et chacun d'eux peut avoir différents niveaux de fragmentation. Ensuite, vous pouvez en choisir un et effectuer une opération de «RÉORGANISATION» ou «RECONSTRUCTION» dans cet index particulier, sans affecter le reste.
À ma connaissance, il n'y a pas de «fragmentation de table» en tant que telle, et SQL Server ne fournit aucun outil pour corriger la «fragmentation de table». Il fournit des outils pour vérifier la fragmentation de l'index (compris comme le rapport entre le nombre de pages utilisées par un index VS la plénitude de cette page et la contiguïté), ainsi que la fragmentation interne et externe.
Tout cela est assez simple à comprendre, du moins pour moi.
Maintenant, quand vient le temps de maintenir les index dans MySQL, il n'existe que le concept de «fragmentation de table, comme mentionné ci-dessus.
Une table dans MySQL peut avoir plusieurs index, mais quand je vérifie le «taux de fragmentation» avec cette fameuse formule, je ne vois pas la fragmentation de chaque index, mais la table dans son ensemble.
Quand je veux optimiser les index dans MySQL, je ne choisis pas un index particulier sur lequel opérer (comme dans SQL Server). Au lieu de cela, je fais une opération «OPTIMIZE» dans toute la table, ce qui affecte vraisemblablement tous les index.
Lorsque la table est optimisée dans MySQL, le rapport entre l'espace utilisé par data + index VS l'espace global est réduit, ce qui suggère une sorte de réorganisation physique dans le disque dur, ce qui se traduit par une réduction de l'espace physique. Cependant, la fragmentation d'index ne concerne pas seulement l'espace physique, mais la structure de l'arborescence qui a été modifiée au fil du temps en raison des insertions et des mises à jour.
Enfin, j'ai obtenu une table dans InnoDB / MySQL. Ce tableau contient 3 millions d'enregistrements, 105 colonnes et 55 index. Il est de 1,5 Go hors index, qui sont de 2,1 Go.
Cette table est frappée des milliers de fois par jour pour la mise à jour, l'insertion (nous ne supprimons pas réellement les enregistrements).
Cette table a été créée des années et je sais avec certitude que personne ne tient à jour les index.
Je m'attendais à y trouver une énorme fragmentation, mais lorsque j'effectue le calcul de fragmentation comme prescrit
free_space / (data_length + index_length)
il s'avère que je n'ai qu'une fragmentation de 0,2%. À mon humble avis, c'est assez irréaliste.
Les grandes questions sont donc:
- Comment vérifier la fragmentation d'un index particulier dans MySQL, pas la table dans son ensemble
- OPTIMIZE TABLE corrige-t-il réellement la fragmentation interne / externe d'un index comme dans SQL Server?
- Lorsque j'optimise une table dans MySQL, est-ce qu'il reconstruit tous les index de la table?
- Est-il réaliste de penser que réduire l'espace physique d'un index (sans reconstruire l'arbre lui-même) se traduit réellement par de meilleures performances?