la réponse courte:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
La réponse "Vous devez savoir"
tout d'abord, vous devez comprendre que les tables Mysql sont fragmentées lorsqu'une ligne est mise à jour, c'est donc une situation normale. Lorsqu'une table est créée, disons importée à l'aide d'un vidage avec des données, toutes les lignes sont stockées sans fragmentation dans de nombreuses pages de taille fixe. Lorsque vous mettez à jour une ligne de longueur variable, la page contenant cette ligne est divisée en deux ou plusieurs pages pour stocker les modifications et ces deux nouvelles pages (ou plus) contiennent des espaces vides remplissant l'espace inutilisé.
Cela n'affecte pas les performances, sauf bien sûr si la fragmentation augmente trop. Ce qui est trop de fragmentation, voyons bien la requête que vous recherchez:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH et INDEX_LENGTH sont l'espace utilisé par vos données et index, et DATA_FREE est la quantité totale d'octets inutilisés dans toutes les pages de table (fragmentation).
Voici un exemple d'une vraie table de production
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
Dans ce cas, nous avons une table utilisant (896 + 316) = 1212 Mo, et avons des données sur un espace libre de 5 Mo. Cela signifie un "rapport de fragmentation" de:
5/1212 = 0.0041
... Ce qui est un "taux de fragmentation" vraiment faible.
J'ai travaillé avec des tables avec un ratio proche de 0,2 (soit 20% des espaces vides) et je ne remarque jamais de ralentissement des requêtes, même si j'optimise la table, les performances sont les mêmes. Mais appliquer une table d'optimisation sur une table de 800 Mo prend beaucoup de temps et bloque la table pendant plusieurs minutes, ce qui est impraticable en production.
Donc, si vous considérez ce que vous gagnez en performances et le temps perdu à optimiser une table, je préfère NE PAS OPTIMISER.
Si vous pensez que c'est mieux pour le stockage, voyez votre ratio et voyez combien d'espace pouvez-vous économiser en optimisant. Ce n'est généralement pas trop, donc je préfère NE PAS OPTIMISER.
Et si vous optimisez, la prochaine mise à jour créera des espaces vides en divisant une page en deux ou plus. Mais il est plus rapide de mettre à jour une table fragmentée qu'une table non fragmentée, car si la table est fragmentée, une mise à jour sur une ligne ne divisera pas nécessairement une page.
J'espère que ceci vous aide.