Как вы можете определить, сколько дискового пространства занимает конкретная таблица 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;

Попробуйте!


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


Вопрос в том, как измерить пространство, занимаемое конкретной таблицей .
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

ОП запросил дисковое пространство для конкретной таблицы MySQL, а не для всей базы данных
machineaddict
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.