Как вы можете определить, сколько дискового пространства занимает конкретная таблица MySQL?

145

Есть ли быстрый способ определить, сколько дискового пространства занимает конкретная таблица MySQL? Стол может быть MyISAM или Innodb.

Дан
источник
В PHPMyAdmin вы можете увидеть использование пространства, просто нажав на таблицу.
АР.
Ответы на этот вопрос помогли мне найти решение. Тщательный поиск инструмента, который мог бы помочь мне без выполнения одного и того же запроса каждый раз для получения данных, заставил меня пройтись по MONyog , MySQL Enterprise Monitor , Percona toolkit . Все они дают подробную информацию о диске, но, в конце концов, выбрали MONyog для улучшения графических диаграмм и простого графического интерфейса.
Мэтью

Ответы:

285

Для стола mydb.mytable запустите это для:

БАЙТ

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

килобайт

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

GENERIC

Вот общий запрос, где максимальная единица измерения - ТБ (Терабайт)

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;

Попробуйте!

RolandoMySQLDBA
источник
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;чтобы получить список всех таблиц mydbс именем и размером, упорядоченные по размеру.
kqw
1
Добавьте «DESC» к предложению ORDER BY, чтобы увидеть таблицы, которые сначала занимают больше места на диске. ;)
mvsagar
Если быть точным, при использовании бинарных префиксов (умножение со степенью 2) вы можете вызывать единицы: ки би- байты (KiB), me би- байты (MiB) и ги- би- байты (GiB). Или, Вы можете использовать десятичные префиксы (умножение со степенью 1000), а затем вызывать единицы ki lo bytes (KB), me ga bytes (MB) и gi ga bytes (GB). Подробнее: en.wikipedia.org/wiki/Binary_prefix
Мартон Тамас
Кто-нибудь знает, как сделать то же самое в MSSQL?
Иван Юрченко
@RolandoMySQLDBA, не могли бы вы предложить на этом stackoverflow.com/questions/47976837/…
davidb
15

Быстрый SQL, чтобы получить 20 лучших таблиц в МБ.

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;

Надеюсь, это кому-нибудь пригодится!

Бен
источник
2

В Linux с MySQL установлен по умолчанию:

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

в зависимости от местоположения базы данных mysql в NIXCRAFT

geekymartian
источник
Вопрос в том, как измерить пространство, занимаемое конкретной таблицей .
Flimm
@ShariqueAbdullah это сработает, если вы используете innodb_file_per_table, который не используется по умолчанию, но я думаю, что он очень распространен и / или рекомендован (кто-то может легко доказать, что я ошибаюсь, только мое впечатление).
Seaux
@ Seaux, может быть, но я не нашел, чтобы это использовалось ни в одной из рекомендуемых установок сервера, через которые я прошел. Таким образом, вы можете быть правы, но, поскольку это не по умолчанию, он может не найти его. Кроме того, я думаю, что функции innodb сильно отличаются от MyISAM. Таким образом, даже если у вас есть размер файла, он может быть не таким точным, как в случае с MyISAM. Но вы правы, что может быть одним из решений. Лично я предпочитаю использовать команды MySQL, чтобы получить эту информацию, а не измерять размеры файлов.
Шарик Абдулла
2

Основываясь на ответе RolandMySQLDBA, я думаю, что мы можем использовать вышеупомянутое, чтобы получить размер каждой схемы в таблице:

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

Очень понравилось!

Артур Фелипе
источник
0

Возможно, вы могли бы посмотреть на размер файлов ...

Каждая таблица хранится в паре отдельных файлов в папке, которая называется как бы вы ни называли вашу базу данных. Эти папки хранятся в каталоге данных mysql.

Оттуда вы можете сделать 'du -sh. *', Чтобы получить размер таблицы на диске.

Люк Чедвик
источник
Это работает только для баз данных MyISAM. ОП попросил решение, которое также работает с InnoDB.
Bgs
0

Взято из Как проверить, сколько дискового пространства использует моя база данных?

Вы можете проверить размер таблицы MySQL, посмотрев на phpMyAdminпанель управления, щелкнув имя базы данных в левом фрейме и считав размер таблиц в правом фрейме.

Приведенный ниже запрос также поможет получить ту же информацию в 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';
Рахул
источник
Это предполагает, что phpMyAdmin установлен
thebigjc
-1

Я бы просто использовал инструмент « mysqldiskusage » следующим образом

$ 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
источник
ОП запросил дисковое пространство для конкретной таблицы MySQL, а не для всей базы данных
machineaddict