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

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

show table status from myDatabaseName;

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

В какой колонке я должен смотреть?

Ответ 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"
    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;

Ответ 2

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

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

Ответ 3

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; 

Это сортирует размеры (размер DB в MB).

Ответ 4

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

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

Существует простой способ получить много информации с помощью Workbench:

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

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

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

Ответ 6

Предположим, что ваше имя базы данных "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)

Для конкретной таблицы:

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)

Ответ 7

Попробуйте выполнить следующую команду оболочки (замените 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 проверьте следующий пример script, который отобразит самые большие используемые таблицы:

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

Ответ 8

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

например.

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

Ответ 9

Вот еще один способ отработать это из командной строки 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)" Размер в MB "FROM information_schema.TABLES WHERE table_schema = \" $i\ "ORDER BY (data_length + index_length) DESC"; сделанный Код >

Ответ 10

Адаптированный из ChapMic ответ на мой вопрос.

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

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;

Ответ 11

Еще один способ показать количество занятых и упорядоченных строк и пространства.

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

Ответ 12

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

Ответ 13

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

(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"
)

Ответ 14

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

Ответ 15

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

Ответ 16

Я считаю, что существующие ответы на самом деле не дают размер таблиц на диске, что является более полезным. Этот запрос дает более точную оценку диска по сравнению с размером таблицы на основе 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