¿Cómo puede determinar cuánto espacio en disco ocupa una tabla MySQL en particular?

145

¿Hay una manera rápida de determinar cuánto espacio en disco ocupa una tabla MySQL en particular? La tabla puede ser MyISAM o Innodb.

dan
fuente
En PHPMyAdmin puede ver el uso del espacio simplemente haciendo clic en ob la tabla.
AR.
Las respuestas a esta pregunta me ayudaron a encontrar mi solución. Una búsqueda exhaustiva de una herramienta que podría ayudarme sin ejecutar la misma consulta cada vez para obtener los datos me hizo pasar por MONyog , MySQL Enterprise Monitor , kit de herramientas Percona . Todos ellos dan detalles sobre la información del disco, pero finalmente optaron por MONyog para obtener mejores gráficos y una GUI fácil.
Mateo

Respuestas:

285

Para una tabla, mydb.mytableejecute esto para:

BYTES

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

KILOBITOS

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';

GENÉRICO

Aquí hay una consulta genérica donde la unidad de visualización máxima es 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;

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
66
SELECT (data_length+index_length)/power(1024,2) tablesize_mb, table_name FROM information_schema.tables WHERE table_schema='mydb' order by tablesize_mb;para obtener una lista de todas las tablas mydbcon nombre y tamaño, ordenadas por tamaño.
kqw
1
Agregue "DESC" a la cláusula ORDER BY para ver primero las tablas que consumen más espacio en disco. ;)
mvsagar
Para ser precisos, es posible que desee llamar a las unidades ki bi bytes (KiB), me bi bytes (MiB) y gi bi bytes (GiB) cuando utilice prefijos binarios (multiplicación con la potencia de 2). O bien, puede utilizar prefijos decimales (multiplicación con la potencia de 1000) y luego llamar a las unidades ki lo bytes (KB), me ga bytes (MB) y gi ga bytes (GB). Ver más: en.wikipedia.org/wiki/Binary_prefix
Márton Tamás
¿Alguien sabe cómo hacer lo mismo en MSSQL?
Ivan Yurchenko
@RolandoMySQLDBA, ¿podría sugerir en este stackoverflow.com/questions/47976837/…
davidb
15

Bit rápido de SQL para obtener las 20 tablas más grandes en MB.

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;

Espero que sea útil para alguien!

Ben
fuente
2

En Linux con MySQL instalado por defecto:

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

basado en la ubicación de mysql db de NIXCRAFT

geekymartian
fuente
La pregunta es cómo medir el espacio ocupado por una tabla en particular .
Flimm
@ShariqueAbdullah esto funcionará si está usando innodb_file_per_table, que no es el predeterminado, pero creo que es muy común y / o recomendado (alguien puede probarme fácilmente que estoy equivocado en esto, solo mi impresión).
Seaux
@Seaux, puede ser, pero no he encontrado que se esté utilizando en ninguna de las configuraciones de servidor recomendadas por las que he pasado. Entonces puede que tengas razón, pero dado que no es el predeterminado, puede que no lo encuentre. Además, creo que innodb funciona bastante diferente en comparación con MyISAM. Entonces, incluso si tiene el tamaño de archivo, puede que no sea tan preciso como lo sería en el caso de MyISAM. Pero tienes razón, esa puede ser una solución. Personalmente prefiero usar los comandos de MySQL para obtener esta información en lugar de medir el tamaño de los archivos.
Sharique Abdullah
2

Basado en la respuesta de RolandMySQLDBA, creo que podemos usar lo anterior para obtener el tamaño de cada esquema en una tabla:

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

Realmente me gustó!

Arthur Felipe
fuente
0

Quizás podrías mirar el tamaño de los archivos ...

Cada tabla se almacena en un par de archivos separados dentro de una carpeta que se llama como se llame su base de datos. Estas carpetas se almacenan dentro del directorio de datos mysql.

Desde allí puede hacer un 'du -sh. *' Para obtener el tamaño de la tabla en el disco.

Luke Chadwick
fuente
Esto solo funciona para las bases de datos MyISAM. El OP solicitó una solución que también funcione con InnoDB.
Bgs
0

Tomado de ¿Cómo verifico cuánto espacio en disco está usando mi base de datos?

Puede verificar el tamaño de la tabla MySQL mirando phpMyAdminel panel de control haciendo clic en el nombre de la base de datos en el marco izquierdo y leyendo el tamaño de las tablas allí en el marco derecho.

La siguiente consulta también ayudará a obtener la misma información en 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
fuente
Esto supone que se ha instalado phpMyAdmin
thebigjc
-1

Simplemente usaría la herramienta ' mysqldiskusage ' de la siguiente manera

$ 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
fuente
El PO pidió espacio en disco de especial tabla de MySQL, no toda la base de datos
machineaddict