La solution est d’utiliser les données stockées dans la BDD information_schema et notamment les colonnes DATA_LENGTH et INDEX_LENGTH qui stockent respectivement la taille des données de chaque table et la taille des données des index de chaque table, le tout exprimé en bytes.
La requête suivante comme donc les 2 informations et effectue une multiplication pour obtenir la valeur en megabytes. La clause HAVING permet de ne lister que les tables dépassant une certaine taille, elle peut être retirée si l’on souhaite lister toutes les tables.
SELECT TABLE_NAME AS `table_name`, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `size_mb` FROM information_schema.TABLES WHERE TABLE_SCHEMA = "database_name" HAVING `size_mb` > 100 ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;