So ermitteln Sie die Größe von Indizes in MySQL

86

Ich möchte die Größe meiner Indizes bestimmen, es handelt sich um Primärschlüsselindizes. Dies geschieht zufällig auf einem MySQL-Cluster, aber ich denke nicht, dass dies von Bedeutung ist.

Brian G.
quelle

Antworten:

96

Ich denke, das ist was du suchst.

show table status from [dbname]

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

Josh Warner-Burke
quelle
2
Avg_row_length, Data_length, Max_data_length, Index_length, Data_free werden alle in Bytes angegeben, ja.
Luke Rehmann
22
Dies gibt die Gesamtindexgröße an , nicht eine Größe pro Index (vorausgesetzt, eine Tabelle hat mehrere Indizes).
Sai
70

Erweiterung der Antwort von Vajk Hermecz.
Auf diese Weise können Sie die gesamte Größe der Indizes in Megabyte ohne das nach Größe geordnete PRIMARY (die Tabelle selbst) ermitteln.

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
quelle
1
Warum bis 4 bestellen?
Alex
1
@Alex so ordnet es nach 4. Feld, das die Größe ist. dh zeigen größte Tabelle zuerst, kleinste zuletzt
Daniel Zohar
1
Ist es nicht einfach besser zu benutzen : ORDER BY size_in_mb DESC;?
NeverEndingQueue
1
@NeverEndingQueue es ist ein bisschen eine Frage des Stils, aber ich kann sehen, wie es in diesem Fall besser lesbar wäre. Ich habe die Antwort geändert und sie lautet jetzt wie von Ihnen vorgeschlagen.
Daniel Zohar
42

Wenn Sie InnoDB-Tabellen verwenden, können Sie die Größe für einzelne Indizes abrufen mysql.innodb_index_stats. Der Status 'Größe' enthält die Antwort in Seiten, daher müssen Sie sie mit der Seitengröße multiplizieren, die standardmäßig 16 KB beträgt .

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';
Vajk Hermecz
quelle
1
Fantastisch. Genau das, wonach ich gesucht habe!
Dave Martorana
3
Zur Verdeutlichung: Bei dieser Abfrage wird die stat_valuebereits mit der Seitengröße multipliziert, sodass die Spalte die Indexgröße in Byte angibt.
Benedikt Köppel
2
Vielen Dank, viel besser als die akzeptierte Antwort. Ein Hinweis für andere Noobs wie mich - Datenbankname, Tabellenname und Indexname - darf nicht durch Ihren echten Datenbanknamen und Tabellennamen ersetzt werden;) Stattdessen sollte der Befehl genau so verwendet werden, wie er ist.
Luben
in meinem Fall gab es eine ganz andere (und unrealistische) Größe als die vonshow table status from [dbname]
Architectonic
6

Ein MyISAM, jeder Indexblock ist eine 4 KBSeite, die fill_factormit Indexdatensätzen gefüllt ist , die jeweils key length + 4Bytes lang sind.

Fill factor ist normalerweise 2/3

Da InnoDBdie Tabelle immer auf dem gruppiert ist PRIMARY KEY, gibt es keinen separaten PRIMARY KEYIndex

Quassnoi
quelle
6

Hier ist eine Anpassung von einigen der oben genannten, um Ihnen auch den Prozentsatz des Gesamtindex für die Tabelle zu geben, die jeder Index verwendet hat. Hoffentlich ist dies für jemanden nützlich

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'

Beispielausgabe

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

Grüße Liam

Liam Wheldon
quelle
Ich habe einen bestimmten Fall, in dem für einen PK-Index der Prozentsatz Werte über 100 anzeigt, wie 1844 oder 677. Ich denke, es gibt ein Problem mit der Abfrage für diese Fälle.
Alex Pandrea
2

Bei Verwendung von phpMyAdmin befindet sich beim Anzeigen der Tabellenstruktur irgendwo unten ein Link zu Details. Sobald Sie darauf klicken, wird die Gesamtgröße der Indizes angezeigt, die sich in der Tabelle befinden, in der sie als Speicherplatznutzung gekennzeichnet sind.

Ich denke nicht, dass es Ihnen jeden Index einzeln zeigt.

Peter D.
quelle
Mit phpMyAdmin ist das ganz einfach. Vielen Dank!
MrFabio
1

Aus der MySQL 5.6-Referenz

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
quelle