Я могу выполнить этот запрос, чтобы получить размеры всех таблиц в базе данных MySQL:
show table status from myDatabaseName;
Я хотел бы помочь в понимании результатов. Я ищу столы с самыми большими размерами.
На какую колонку мне посмотреть?
Я могу выполнить этот запрос, чтобы получить размеры всех таблиц в базе данных MySQL:
show table status from myDatabaseName;
Я хотел бы помочь в понимании результатов. Я ищу столы с самыми большими размерами.
На какую колонку мне посмотреть?
Ответы:
Вы можете использовать этот запрос, чтобы показать размер таблицы (хотя сначала вам нужно подставить переменные):
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;
AND table_name IN ('table_1', 'table_2', 'table_3');
VARCHAR
и BLOB
набрали?
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
Если вы хотите, чтобы запрос использовал текущую выбранную базу данных. просто скопируйте и вставьте этот запрос. (Никаких изменений не требуется)
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;
SIZE_MB
FROM information_schema.TABLES WHERE table_schema = DATABASE () ORDER BY (data_length + index_length) ASC;
Есть простой способ получить много информации, используя Workbench:
Щелкните правой кнопкой мыши имя схемы и выберите «Инспектор схемы».
В появившемся окне у вас есть несколько вкладок. Первая вкладка «Информация» показывает приблизительную оценку размера базы данных в МБ.
Вторая вкладка «Таблицы» показывает длину данных и другие детали для каждой таблицы.
Размер всех столов:
Предположим, что ваша база данных или 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)
Попробуйте следующую команду оболочки (замените ее 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
Вот еще один способ решить эту проблему с помощью командной строки 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
Адаптировано из ответа 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;
Если у вас есть ssh
доступ, вы можете просто попробовать du -hc /var/lib/mysql
(или иначе datadir
, как указано в вашем my.cnf
).
Другой способ показать количество строк и занимаемое пространство и упорядочить его.
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".
Я считаю, что существующие ответы на самом деле не дают размер таблиц на диске, что более полезно. Этот запрос дает более точную оценку диска по сравнению с размером таблицы на основе 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
Рассчитайте общий размер базы данных в конце:
(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"
)
Это должно быть проверено в 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;