NFsec Logo

Ile miejsca zajmują tabele i bazy w MySQL?

26/09/2011 w Administracja 1 komentarz.  (artykuł nr 326, 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

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : , , , , ,

1 komentarz.

  1. Patryk Krawaczyński napisał(a):

    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.

Zostaw odpowiedź.

Musisz być zalogowany by móc komentować.