Jak obliczyć rozmiar indeksów w MySQL

88

Chcę określić rozmiar moich indeksów, są to indeksy klucza podstawowego. Dzieje się tak w klastrze mysql, ale nie sądzę, żeby to miało znaczenie.

Brian G.
źródło

Odpowiedzi:

99

Myślę, że właśnie tego szukasz.

show table status from [dbname]

http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html

Josh Warner-Burke
źródło
2
Avg_row_length, Data_length, Max_data_length, Index_length, Data_free są podawane w bajtach, tak.
Luke Rehmann
23
Daje to całkowity rozmiar indeksu, a nie rozmiar na indeks (zakładając, że tabela ma wiele indeksów).
Sai
72

Rozszerzam odpowiedź Vajka Hermecza.
W ten sposób można uzyskać rozmiar wszystkich indeksów, w megabajtach, bez elementu PRIMARY (czyli samej tabeli), uporządkowanych według rozmiaru.

SELECT database_name, table_name, index_name,
ROUND(stat_value * @@innodb_page_size / 1024 / 1024, 2) size_in_mb
FROM mysql.innodb_index_stats
WHERE stat_name = 'size' AND index_name != 'PRIMARY'
ORDER BY size_in_mb DESC;
Daniel Zohar
źródło
1
DLACZEGO ZAMAWIĆ 4?
Alex
1
@Alex, więc porządkuje według czwartego pola, czyli rozmiaru. tzn. pokaż największy stół jako pierwszy, najmniejszy jako ostatni
Daniel Zohar
1
Czy nie lepiej jest po prostu użyć ORDER BY size_in_mb DESC;:?
NeverEndingQueue
1
@NeverEndingQueue to trochę kwestia stylu, ale widzę, jak w tym przypadku byłoby to bardziej czytelne. Poprawiłem odpowiedź i teraz brzmi tak, jak sugerowałeś.
Daniel Zohar
42

Jeśli używasz tabel InnoDB, możesz pobrać rozmiar poszczególnych indeksów z mysql.innodb_index_stats. Statystyka „rozmiaru” zawiera odpowiedź w stronach, więc musisz ją pomnożyć przez rozmiar strony, który domyślnie wynosi 16 KB .

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';
Vajk Hermecz
źródło
1
Fantastyczny. Dokładnie to, czego szukałem!
Dave Martorana,
3
Dla wyjaśnienia: w tym zapytaniu wartość stat_valuejest już pomnożona przez rozmiar strony, więc kolumna podaje rozmiar indeksu w bajtach.
Benedikt Köppel
2
Dziękuję znacznie lepiej niż zaakceptowana odpowiedź. Uwaga dla innych noobów, takich jak ja - nazwa_bazy_danych, nazwa_tabeli i nazwa_indeksu nie powinny być zastępowane rzeczywistą nazwą bazy danych i nazwą tabeli;) zamiast tego polecenie powinno być używane dokładnie tak, jak jest.
luben
w moim przypadku dało to bardzo inny (i nierealistyczny) rozmiar od podanego przezshow table status from [dbname]
architektoniczne
6

W przypadku MyISAMkażdego bloku indeksu 4 KBstrona jest wypełniona fill_factorrekordami indeksu, z których każdy ma key length + 4długość bajtów.

Fill factor jest normalnie 2/3

Jeśli chodzi o InnoDBtabelę, jest ona zawsze skupiona na PRIMARY KEY, nie ma oddzielnego PRIMARY KEYindeksu

Quassnoi
źródło
6

Oto adaptacja niektórych z powyższych, aby również podać procent całkowitego indeksu dla tabeli, z którego korzystał każdy indeks, mam nadzieję, że przyda się to komuś

select 
    database_name, 
    table_name, 
    index_name, 
    round((stat_value*@@innodb_page_size)/1024/1024, 2) SizeMB, 
    round(((100/(SELECT INDEX_LENGTH FROM INFORMATION_SCHEMA.TABLES t WHERE t.TABLE_NAME = iis.table_name and t.TABLE_SCHEMA = iis.database_name))*(stat_value*@@innodb_page_size)), 2) `Percentage`
from mysql.innodb_index_stats iis 
where stat_name='size' 
and table_name = 'TargetTable'
and database_name = 'targetDB'

Przykładowe dane wyjściowe

database_name   table_name  index_name  SizeMB  Percentage
targetDB        TargetTable id          10      55.55
targetDB        TargetTable idLookup    5       27.77
targetDB        TargetTable idTest      3       16.66

Pozdrawiam Liam

Liam Wheldon
źródło
Mam szczególny przypadek, w którym dla PK indeksuje Procent pokazuje wartości powyżej 100, np. 1844 lub 677. Myślę, że jest problem z zapytaniem o te przypadki.
Alex Pandrea
2

Używając phpMyAdmin, podczas przeglądania struktury tabeli, gdzieś na dole znajduje się link Szczegóły. Po kliknięciu wyświetli się całkowity rozmiar indeksów, które masz w tabeli, w której jest zaznaczone użycie miejsca.

Nie sądzę jednak, aby wyświetlał każdy indeks indywidualnie.

Peter D.
źródło
Dzięki phpMyAdmin jest to naprawdę łatwe. Dziękuję Ci!
MrFabio
1

Z referencji MySQL 5.6

SELECT SUM(stat_value) pages, index_name,
SUM(stat_value)*@@innodb_page_size size
FROM mysql.innodb_index_stats WHERE table_name='t1'
AND stat_name = 'size' GROUP BY index_name;
viggy28
źródło