Comment pouvez-vous déterminer la quantité d'espace disque occupée par une table MySQL particulière?

145

Existe-t-il un moyen rapide de déterminer l'espace disque occupé par une table MySQL particulière? La table peut être MyISAM ou Innodb.

dan
la source
Dans PHPMyAdmin, vous pouvez voir l'utilisation de l'espace en cliquant simplement sur le tableau.
AR.
Les réponses à cette question m'ont aidé à trouver ma solution. Une recherche approfondie d'un outil qui pourrait m'aider sans exécuter la même requête à chaque fois pour obtenir les données m'a fait passer par MONyog , MySQL Enterprise Monitor , Percona toolkit . Tous donnent des détails sur les informations du disque, mais ont finalement opté pour MONyog pour de meilleurs graphiques graphiques et une interface graphique facile.
Mathew

Réponses:

285

Pour une table, mydb.mytableexécutez ceci pour:

BYTES

SELECT (data_length+index_length) tablesize
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

KILOBYTES

SELECT (data_length+index_length)/power(1024,1) tablesize_kb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

MEGABYTES

SELECT (data_length+index_length)/power(1024,2) tablesize_mb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GIGABYTES

SELECT (data_length+index_length)/power(1024,3) tablesize_gb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GÉNÉRIQUE

Voici une requête générique où l'affichage de l'unité maximum est TB (TeraBytes)

SELECT 
    CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',SUBSTR(units,pw1*2+1,2)) DATSIZE,
    CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',SUBSTR(units,pw2*2+1,2)) NDXSIZE,
    CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',SUBSTR(units,pw3*2+1,2)) TBLSIZE
FROM
(
    SELECT DAT,NDX,TBL,IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (
        SELECT data_length DAT,index_length NDX,data_length+index_length TBL,
        FLOOR(LOG(IF(data_length=0,1,data_length))/LOG(1024)) px,
        FLOOR(LOG(IF(index_length=0,1,index_length))/LOG(1024)) py,
        FLOOR(LOG(IF(data_length+index_length=0,1,data_length+index_length))/LOG(1024)) pz
        FROM information_schema.tables
        WHERE table_schema='mydb'
        AND table_name='mytable'
    ) AA
) A,(SELECT 'B KBMBGBTB' units) B;

Essaie !!!

RolandoMySQLDBA
la source
6
SELECT (data_length+index_length)/power(1024,2) tablesize_mb, table_name FROM information_schema.tables WHERE table_schema='mydb' order by tablesize_mb;pour obtenir une liste de toutes les tables de mydbavec nom et taille, classées par taille.
kqw
1
Ajoutez «DESC» à la clause ORDER BY pour voir d'abord les tables qui consomment plus d'espace disque. ;)
mvsagar
Pour être précis, vous pouvez appeler les unités ki bi octets (KiB), me bi octets (MiB) et gi bi octets (Gio) lorsque vous utilisez des préfixes binaires (multiplication avec la puissance de 2). Ou, vous pouvez utiliser des préfixes décimaux (multiplication avec la puissance de 1000), puis appeler les unités ki lo octets (Ko), me ga octets (Mo) et gi ga octets (Go). Voir plus: en.wikipedia.org/wiki/Binary_prefix
Márton Tamás
Est-ce que quelqu'un sait comment faire de même dans MSSQL?
Ivan Yurchenko
@RolandoMySQLDBA, pourriez-vous s'il vous plaît suggérer sur ce stackoverflow.com/questions/47976837/…
davidb
15

Petit peu de SQL pour obtenir les 20 plus grandes tables en Mo.

SELECT table_schema, table_name,
  ROUND((data_length+index_length)/POWER(1024,2),2) AS tablesize_mb
FROM information_schema.tables
ORDER BY tablesize_mb DESC LIMIT 20;

J'espère que c'est utile à quelqu'un!

Ben
la source
2

Sous Linux avec mysql installé par défaut:

[you@yourbox]$ ls -lha /var/lib/mysql/<databasename>

basé sur l' emplacement de la base de données mysql de NIXCRAFT

geekymartian
la source
La question est de savoir comment mesurer l'espace occupé par une table particulière .
Flimm
@ShariqueAbdullah cela fonctionnera si vous utilisez innodb_file_per_table, qui n'est pas par défaut, mais je pense que c'est très courant et / ou recommandé (quelqu'un peut facilement me prouver le contraire, juste mon impression).
Seaux
@Seaux, peut-être, mais je ne l'ai pas trouvé utilisé dans les configurations de serveur recommandées que j'ai traversées. Vous avez peut-être raison, mais comme ce n'est pas la valeur par défaut, il se peut qu'il ne le trouve pas. De plus, je pense qu'innodb fonctionne très différemment de MyISAM. Donc, même si vous avez la taille du fichier, il se peut qu'elle ne soit pas aussi précise qu'elle le serait dans le cas de MyISAM. Mais vous avez raison, cela peut être une solution. Personnellement, je préfère utiliser les commandes MySQL pour obtenir ces informations plutôt que de mesurer la taille des fichiers.
Sharique Abdullah
2

Sur la base de la réponse de RolandMySQLDBA, je pense que nous pouvons utiliser ce qui précède pour obtenir la taille de chaque schéma dans une table:

SELECT table_schema, SUM((data_length+index_length)/power(1024,1)) tablesize_kb 
    FROM information_schema.tables GROUP BY table_schema;

Vraiment aimé!

Arthur Felipe
la source
0

Vous pourriez peut-être regarder la taille des fichiers ...

Chaque table est stockée dans quelques fichiers séparés dans un dossier qui porte le nom que vous avez appelé votre base de données. Ces dossiers sont stockés dans le répertoire de données mysql.

De là, vous pouvez faire un 'du -sh. *' Pour obtenir la taille de la table sur le disque.

Luke Chadwick
la source
Cela ne fonctionne que pour les bases de données MyISAM. Le PO a demandé une solution qui fonctionne également avec InnoDB.
Bgs
0

Tiré de Comment vérifier l'espace disque utilisé par ma base de données?

Vous pouvez vérifier la taille de la table MySQL soit en regardant phpMyAdmindans votre panneau de contrôle en cliquant sur le nom de la base de données dans le cadre de gauche et en lisant la taille des tables dans le cadre de droite.

La requête ci-dessous aidera également à obtenir les mêmes informations dans bytes

select SUM(data_length) + SUM(index_length) as total_size 
from information_schema.tables 
where table_schema = 'db_name' 
and table_name='table_name';
Rahul
la source
Cela suppose que phpMyAdmin est installé
thebigjc
-1

J'utiliserais simplement l'outil ' mysqldiskusage ' comme suit

$ mysqldiskusage --server=user:password@localhost mydbname
# Source on localhost: ... connected.

# Database totals:
+------------+----------------+
| db_name    |         total  |
+------------+----------------+
| mydbaname  | 5,403,033,600  |
+------------+----------------+

Total database disk usage = 5,403,033,600 bytes or 5.03 GB
Natouriano
la source
L'OP a demandé de l'espace disque pour une table MySQL particulière, pas pour toute la base de données
machineaddict