Ile miejsca zajmują tabele i bazy w MySQL?
Napisał: Patryk Krawaczyński
26/09/2011 w Administracja 1 komentarz. (artykuł nr 328, ilość słów: 729)
Z
nalezienie najwięcej zajmujących tabeli i baz w MySQL 5.0+ jest możliwe dzięki metadanym znajdującym się w tabeli INFORMATION_SCHEMA. Przechowuje ona informacje o wszystkich bazach danych, jakie serwer MySQL utrzymuje. Na przykład, aby znaleźć całkowitą liczbę tabel, wierszy oraz danych w indeksach dla danej instancji serwera MySQL wystarczy wydać polecenie:
SELECT count(*) tables, concat(round(sum(table_rows)/1000000,2),'M') rows, concat(round(sum(data_length)/(1024*1024*1024),2),'G') data, concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx, concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size, round(sum(index_length)/sum(data_length),2) idxfrac FROM information_schema.TABLES;
Przykładowym wynikiem może być:
+--------+-------+-------+-------+------------+---------+ | tables | rows | data | idx | total_size | idxfrac | +--------+-------+-------+-------+------------+---------+ | 106 | 2.96M | 0.09G | 0.14G | 0.22G | 1.57 | +--------+-------+-------+-------+------------+---------+ 1 row in set (0.18 sec)
To samo zapytanie, możemy zastosowań dla konkretnej tabeli:
SELECT count(*) tables, concat(round(sum(table_rows)/1000000,2),'M') rows, concat(round(sum(data_length)/(1024*1024*1024),2),'G') data, concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx, concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size, round(sum(index_length)/sum(data_length),2) idxfrac FROM information_schema.TABLES WHERE table_name like "%nazwa_tabeli%";
Przykładowym wynikiem może być:
+--------+-------+-------+-------+------------+---------+ | tables | rows | data | idx | total_size | idxfrac | +--------+-------+-------+-------+------------+---------+ | 8 | 0.05M | 0.01G | 0.00G | 0.01G | 0.20 | +--------+-------+-------+-------+------------+---------+ 1 row in set (0.00 sec)
Jeśli interesuje nas informacja o 10 największych bazach w serwerze wystarczy wydać zapytanie:
SELECT count(*) tables, table_schema,concat(round(sum(table_rows)/1000000,2),'M') rows, concat(round(sum(data_length)/(1024*1024*1024),2),'G') data, concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx, concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size, round(sum(index_length)/sum(data_length),2) idxfrac FROM information_schema.TABLES GROUP BY table_schema ORDER BY sum(data_length+index_length) DESC LIMIT 10;
Przykładowym wynikiem może być:
+--------+------------------+--------+--------+-------+------------+---------+ | tables | table_schema | rows | data | idx | total_size | idxfrac | +--------+------------------+--------+--------+-------+------------+---------+ | 153 | nfsec | 47.31M | 30.79G | 1.51G | 32.30G | 0.05 | | 157 | infomafia | 35.06M | 20.89G | 1.19G | 22.08G | 0.06 | | 219 | stardust | 67.43M | 11.14G | 7.54G | 18.69G | 0.68 | | 201 | darkstar | 55.04M | 8.28G | 5.54G | 13.82G | 0.67 | | 2 | statistics | 6.34M | 5.26G | 0.00G | 5.26G | 0.00 | | 168 | ids_logs | 7.64M | 4.19G | 0.25G | 4.44G | 0.06 | | 88 | ips_logs | 38.59M | 2.06G | 0.99G | 3.05G | 0.48 | | 139 | ftp_logs | 9.83M | 2.02G | 0.75G | 2.77G | 0.37 | | 250 | replication | 2.45M | 0.62G | 0.27G | 0.89G | 0.43 | | 1 | images_files | 0.12M | 0.28G | 0.00G | 0.28G | 0.00 | +--------+------------------+--------+--------+-------+------------+---------+
Więcej informacji: Researching your MySQL table sizes, INFORMATION_SCHEMA
Należy mieć na uwadze, że zgodnie z dokumentacją wartość table_rows dla silnika InnoDB jest orientacyjna. Podziękowania dla użytkownika o nicku krogon za przesłanie informacji.