Comment obtenir les tailles des tables d'une base de données MySQL?


900

Je peux exécuter cette requête pour obtenir les tailles de toutes les tables dans une base de données MySQL:

show table status from myDatabaseName;

J'aimerais avoir de l'aide pour comprendre les résultats. Je recherche des tables avec les plus grandes tailles.

Quelle colonne dois-je consulter?


8
Qu'entendez-vous par taille? Nombre de rangées? Octets pris sur le disque?
Mark Byers

@Mark je veux une taille sur le disque est-ce la bonne méthode? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
En relation, si cela vous intéresse, j'ai écrit une description de tous les tableaux dans cette réponse .
Drew

Réponses:


1959

Vous pouvez utiliser cette requête pour afficher la taille d'une table (même si vous devez d'abord remplacer les variables):

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME"
    AND table_name = "$TABLE_NAME";

ou cette requête pour répertorier la taille de chaque table dans chaque base de données, la plus grande en premier:

SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
ORDER BY (data_length + index_length) DESC;

3
Merci, cela fonctionne très bien, même si je ne suis pas sûr qu'il tienne compte des Blobs.
David

5
Remarque, vous pouvez également utiliser "IN" pour spécifier plusieurs tables, par exempleAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, cela ne comptera que les longueurs des champs de taille statique correctement. Comment comptez-vous VARCHARet BLOBtapez-vous?
l0b0

4
@kasimir À un moment donné, le monde est devenu confus et certaines organisations de normalisation et fabricants de matériel ont décidé qu'il valait mieux qu'un kilo-octet soit défini sur le système décimal. La norme CEI appelle désormais la base 2 kilo-octets (1024 octets) un kibioctet (Kio). En tout cas, MySQL ne sait pas, donc si vous voulez des kilo-octets décimaux IEC, divisez par 1000.
russellpierce

9
Est-ce que cela fonctionnera pour le moteur de stockage InnoDB? Selon la doc mysql ici - dev.mysql.com/doc/refman/5.7/en/show-table-status.html , le champ data_length de ce moteur contient la taille de l'index clusterisé. Cela ne représentera pas correctement la taille des données. Est-ce que cela va?
euphoria83

96
SELECT TABLE_NAME AS "Table Name", 
table_rows AS "Quant of Rows", ROUND( (
data_length + index_length
) /1024, 2 ) AS "Total Size Kb"
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'YOUR SCHEMA NAME/DATABASE NAME HERE'
LIMIT 0 , 30

Vous pouvez obtenir le nom de schéma de « information_schema » -> schèmes Table -> « SCHEMA_NAME colonne »


Supplémentaire Vous pouvez obtenir la taille des bases de données MySQL comme suit.

SELECT table_schema "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

Résultat

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

Vous pouvez obtenir des détails supplémentaires ici.


41
SELECT 
    table_name AS "Table",  
    round(((data_length + index_length) / 1024 / 1024), 2) as size   
FROM information_schema.TABLES  
WHERE table_schema = "YOUR_DATABASE_NAME"  
ORDER BY size DESC; 

Cela trie les tailles (taille DB en Mo).


31

Si vous souhaitez qu'une requête utilise la base de données actuellement sélectionnée. copiez simplement collez cette requête. (Aucune modification requise)

SELECT table_name ,
  round(((data_length + index_length) / 1024 / 1024), 2) as SIZE_MB
FROM information_schema.TABLES
WHERE table_schema = DATABASE() ORDER BY SIZE_MB DESC;

5
Ou encore plus court (sans sous-requête): SELECT table_name, round (((data_length + index_length) / 1024/1024), 2) SIZE_MBFROM information_schema.TABLES WHERE table_schema = DATABASE () ORDER BY (data_length + index_length) ASC;
Onkeltem

15

Il existe un moyen simple d'obtenir de nombreuses informations à l'aide de Workbench:

  • Cliquez avec le bouton droit sur le nom du schéma et cliquez sur "Inspecteur de schéma".

  • Dans la fenêtre résultante, vous avez un certain nombre d'onglets. Le premier onglet "Info" affiche une estimation approximative de la taille de la base de données en Mo.

  • Le deuxième onglet, "Tables", affiche la longueur des données et d'autres détails pour chaque table.


Je n'avais pas l'onglet «info» sur mon client Mac v 6.0.9
Neil

Génial!!! Dans MySQL Workbench, il y a également un "Inspecteur de table" pour chaque table. Pas bien rapide mais très pratique!
T30

11
  • Taille de toutes les tables:

    Supposons que votre base de données ou votre TABLE_SCHEMAnom soit "news_alert". Ensuite, cette requête affichera la taille de toutes les tables de la base de données.

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
      TABLE_SCHEMA = "news_alert"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;
    

    Production:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
    
  • Pour le tableau spécifique:

    Supposons que votre TABLE_NAMEest - « nouvelles » . Ensuite, la requête SQL sera-

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
        TABLE_SCHEMA = "news_alert"
      AND
        TABLE_NAME = "news"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;
    

    Production:

    +-------+-----------+
    | Table | Size (MB) |
    +-------+-----------+
    | news  |      0.08 |
    +-------+-----------+
    1 row in set (0.00 sec)

8

Essayez la commande shell suivante (remplacez-la DB_NAMEpar le nom de votre base de données):

mysql -uroot <<<"SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"DB_NAME\" ORDER BY (data_length + index_length) DESC;" | head

Pour la solution Drupal / drush, consultez l'exemple de script suivant qui affichera les plus grandes tables utilisées:

#!/bin/sh
DB_NAME=$(drush status --fields=db-name --field-labels=0 | tr -d '\r\n ')
drush sqlq "SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"${DB_NAME}\" ORDER BY (data_length + index_length) DESC;" | head -n20

6

Voici une autre façon de résoudre ce problème en utilisant la ligne de commande bash.

for i in mysql -NB -e 'show databases'; do echo $i; mysql -e "SELECT table_name AS 'Tables', round(((data_length+index_length)/1024/1024),2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema =\"$i\" ORDER BY (data_length + index_length) DESC" ; done


6

Si vous utilisez phpmyadmin, allez simplement dans la structure du tableau

par exemple

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

Adapté de la réponse de ChapMic pour répondre à mon besoin particulier.

Spécifiez uniquement le nom de votre base de données, puis triez toutes les tables dans l'ordre décroissant - de la PLUS GRANDE à la PLUS PETITE table de la base de données sélectionnée. Ne nécessite qu'une seule variable à remplacer = le nom de votre base de données.

SELECT 
table_name AS `Table`, 
round(((data_length + index_length) / 1024 / 1024), 2) AS `size`
FROM information_schema.TABLES 
WHERE table_schema = "YOUR_DATABASE_NAME_HERE"
ORDER BY size DESC;

3

Si vous y avez sshaccès, vous voudrez peut-être simplement essayer du -hc /var/lib/mysql(ou différent datadir, comme défini dans votre my.cnf) également.


Enfin une réponse qui ne repose pas sur le schéma_information. Dans mon cas, il a rapporté 660 Mo alors que la taille réelle du système de fichiers est de 1,8 Go
php_nub_qq

2

Une autre façon de montrer le nombre de rangées et d'espace occupé et de les classer.

SELECT
     table_schema as `Database`,
     table_name AS `Table`,
     table_rows AS "Quant of Rows",
     round(((data_length + index_length) / 1024 / 1024/ 1024), 2) `Size in GB`
FROM information_schema.TABLES
WHERE table_schema = 'yourDatabaseName'
ORDER BY (data_length + index_length) DESC;  

La seule chaîne que vous devez remplacer dans cette requête est "yourDatabaseName".


2

Je trouve que les réponses existantes ne donnent pas réellement la taille des tables sur le disque, ce qui est plus utile. Cette requête donne une estimation de disque plus précise par rapport à la taille de la table basée sur data_length & index. J'ai dû l'utiliser pour une instance AWS RDS où vous ne pouvez pas examiner physiquement le disque et vérifier la taille des fichiers.

select NAME as TABLENAME,FILE_SIZE/(1024*1024*1024) as ACTUAL_FILE_SIZE_GB
, round(((data_length + index_length) / 1024 / 1024/1024), 2) as REPORTED_TABLE_SIZE_GB 
from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES s
join INFORMATION_SCHEMA.TABLES t 
on NAME = Concat(table_schema,'/',table_name)
order by FILE_SIZE desc

1

Calculez la taille totale de la base de données à la fin:

(SELECT 
  table_name AS `Table`, 
  round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)
UNION ALL
(SELECT 
  'TOTAL:',
  SUM(round(((data_length + index_length) / 1024 / 1024), 2) )
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)

1
SELECT TABLE_NAME AS table_name, 
table_rows AS QuantofRows, 
ROUND((data_length + index_length) /1024, 2 ) AS total_size_kb 
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'db'
ORDER BY (data_length + index_length) DESC; 

les 2 ci-dessus sont testés sur mysql


1

Cela devrait être testé dans mysql, pas postgresql:

SELECT table_schema, # "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) # "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

Bien que cela puisse répondre à la question des auteurs, il manque des mots explicatifs et / ou des liens vers la documentation. Les extraits de code brut ne sont pas très utiles sans quelques phrases autour d'eux. Vous pouvez également trouver comment rédiger une bonne réponse très utile. Veuillez modifier votre réponse - De l'avis
Nick

@ Nick pourquoi toujours interdit?
William

Désolé, je ne connais pas la réponse à cela - je ne suis pas un modérateur.
Nick
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.