Как получить размеры таблиц базы данных MySQL?


900

Я могу выполнить этот запрос, чтобы получить размеры всех таблиц в базе данных MySQL:

show table status from myDatabaseName;

Я хотел бы помочь в понимании результатов. Я ищу столы с самыми большими размерами.

На какую колонку мне посмотреть?


8
Что вы подразумеваете под размером? Количество рядов? Байты взяты на диск?
Марк Байерс

@ Марк, я хочу размер на диске, это правильный метод? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ашиш Карпе

3
В связи с этим, если это интересно, я написал описание всех таблиц в этом ответе .
Дрю

Ответы:


1959

Вы можете использовать этот запрос, чтобы показать размер таблицы (хотя сначала вам нужно подставить переменные):

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

или этот запрос, чтобы перечислить размер каждой таблицы в каждой базе данных, по величине сначала:

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
Спасибо, он работает просто отлично, хотя я не уверен, что он принимает во внимание Blobs.
Дэвид

5
Обратите внимание, вы также можете использовать «IN», чтобы указать несколько таблиц, например,AND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, это только правильно посчитает длины полей статического размера. Как бы вы посчитали VARCHARи BLOBнабрали?
10

4
@kasimir В какой-то момент мир запутался, и некоторые организации по стандартизации и производители оборудования решили, что было бы лучше определить килобайт в десятичной системе. Стандарт IEC теперь называет 2 килобайта (1024 байта) кибибайтом (КиБ). Во всяком случае, MySQL не знает, поэтому, если вы хотите десятичные килобайты IEC, разделите на 1000.
russellpierce

9
Будет ли это работать для хранилища InnoDB? Согласно документации mysql здесь - dev.mysql.com/doc/refman/5.7/en/show-table-status.html , поле data_length для этого механизма содержит размер кластеризованного индекса. Это не будет правильно представлять размер данных. Будет ли он?
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

Вы можете получить имя схемы из " information_schema " -> таблица SCHEMATA -> столбец " SCHEMA_NAME "


Дополнительно Вы можете получить размер базы данных mysql следующим образом.

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; 

Результат

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

Вы можете получить дополнительную информацию здесь.


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; 

Это сортирует размеры (размер БД в МБ).


31

Если вы хотите, чтобы запрос использовал текущую выбранную базу данных. просто скопируйте и вставьте этот запрос. (Никаких изменений не требуется)

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
Или даже короче (без подзапроса): SELECT имя_таблицы, округление (((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

Есть простой способ получить много информации, используя Workbench:

  • Щелкните правой кнопкой мыши имя схемы и выберите «Инспектор схемы».

  • В появившемся окне у вас есть несколько вкладок. Первая вкладка «Информация» показывает приблизительную оценку размера базы данных в МБ.

  • Вторая вкладка «Таблицы» показывает длину данных и другие детали для каждой таблицы.


У меня не было вкладки «информация» на моем клиенте Mac v 6.0.9
Нил

Большой!!! В MySQL Workbench также есть «Инспектор таблиц» для каждой таблицы. Не совсем быстро, но очень удобно!
T30

11
  • Размер всех столов:

    Предположим, что ваша база данных или TABLE_SCHEMAимя "news_alert". Затем этот запрос покажет размер всех таблиц в базе данных.

    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;

    Вывод:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • Для конкретной таблицы:

    Предположим, что TABLE_NAMEэто "новости" . Тогда SQL-запрос будет

    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;

    Вывод:

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

8

Попробуйте следующую команду оболочки (замените ее DB_NAMEименем вашей базы данных):

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

Для решения Drupal / drush, проверьте следующий пример сценария, который будет отображать самые большие используемые таблицы:

#!/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

Вот еще один способ решить эту проблему с помощью командной строки 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

Если вы используете phpmyadmin, просто перейдите к структуре таблицы

например

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

Адаптировано из ответа ChapMic, чтобы соответствовать моей конкретной потребности.

Укажите только имя вашей базы данных, затем отсортируйте все таблицы в порядке убывания - от LARGEST до самой маленькой таблицы внутри выбранной базы данных. Требуется заменить только 1 переменную = имя вашей базы данных.

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

Если у вас есть sshдоступ, вы можете просто попробовать du -hc /var/lib/mysql(или иначе datadir, как указано в вашем my.cnf).


Наконец, ответ, который не зависит от information_schema. В моем случае он сообщил о 660 МБ, в то время как фактический размер файловой системы составляет 1,8 ГБ
php_nub_qq

2

Другой способ показать количество строк и занимаемое пространство и упорядочить его.

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;  

Единственная строка, которую вы должны заменить в этом запросе, это "yourDatabaseName".


2

Я считаю, что существующие ответы на самом деле не дают размер таблиц на диске, что более полезно. Этот запрос дает более точную оценку диска по сравнению с размером таблицы на основе data_length & index. Мне пришлось использовать это для экземпляра AWS RDS, где вы не можете физически изучить диск и проверить размеры файлов.

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

Рассчитайте общий размер базы данных в конце:

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

все 2 выше проверено на mysql


1

Это должно быть проверено в mysql, а не в 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; 

Хотя это может ответить на вопрос авторов, в нем отсутствуют некоторые поясняющие слова и / или ссылки на документацию. Фрагменты исходного кода не очень полезны без каких-либо фраз вокруг них. Вы также можете найти, как написать хороший ответ очень полезно. Пожалуйста, отредактируйте свой ответ - Из обзора
Ник

@ Ник, почему до сих пор забанены?
Уильям

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