Як отримати розміри таблиць бази даних 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
Ashish Karpe

3
Відповідно, якщо це цікавить, я написав опис усіх таблиць у цій відповіді .
Дрю

Відповіді:


1958

Ви можете використовувати цей запит, щоб показати розмір таблиці (хоча вам потрібно спочатку замінити змінні):

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
Дякую, його робота прекрасна, хоча я не впевнений, що це враховує Блобс.
Девід

5
Зауважте, ви також можете використовувати "IN", щоб вказати кілька таблиць, наприкладAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, це буде правильно рахувати довжини полів статичного розміру. Як би ви рахували VARCHARта BLOBтипи?
l0b0

3
@kasimir У якийсь момент світ заплутався, і деякі організації зі стандартів та виробники обладнання вирішили, що краще визначити кілобайт у десятковій системі. Зараз стандарт IEC називає базовий 2-кілобайтний (1024 байт) кібібайт (KiB). У будь-якому випадку, MySQL не знає, тому, якщо ви хочете IEC десяткових кілобайт, розділіть на 1000.
russellpierce

9
Чи буде це працювати для двигуна зберігання InnoDB? Згідно з mysql doc тут - 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
Neil

Чудово !!! У 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_NAMEIS «Новини» . Тоді запит 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, щоб задовольнити мою конкретну потребу.

Вкажіть лише ім’я вашої бази даних, після чого відсортуйте всі таблиці у порядку зменшення - від НАЙГОЛЬШИХ до МАЛІШИХ таблиць всередині вибраної бази даних. Потрібна лише 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).


Нарешті відповідь, яка не покладається на інформаційну схему. У моєму випадку він повідомив про 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

Я вважаю, що існуючі відповіді насправді не дають розміру таблиць на диску, що корисніше. Цей запит дає більш точну оцінку диска порівняно з розміром таблиці на основі даних_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; 

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

@Nick чому все ще заборонено?
Вільям

Вибачте, я не знаю відповіді на це - я не модератор.
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.