Comment déterminer la taille des index dans MySQL

88

Je veux déterminer la taille de mes index, ce sont des index de clé primaire. Cela se trouve être sur le cluster mysql mais je ne pense pas que ce soit significatif.

Brian G
la source

Réponses:

99

Je pense que c'est ce que vous recherchez.

show table status from [dbname]

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

Josh Warner-Burke
la source
2
Avg_row_length, Data_length, Max_data_length, Index_length, Data_free sont tous indiqués en octets, oui.
Luke Rehmann
23
Cela donne la taille totale de l' index, pas une taille par index (en supposant qu'une table a plusieurs indices).
Sai
72

Prolonger la réponse de Vajk Hermecz.
C'est ainsi que vous pouvez obtenir la taille de tous les index, en mégaoctets, sans le PRIMAIRE (qui est la table elle-même), classés par taille.

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
la source
1
Pourquoi COMMANDER PAR 4?
Alex
1
@Alex donc il commande par 4ème champ, qui est la taille. ie montrer la plus grande table en premier, la plus petite en dernier
Daniel Zohar
1
N'est-il pas simplement préférable d'utiliser ORDER BY size_in_mb DESC;:?
NeverEndingQueue
1
@NeverEndingQueue c'est un peu une question de style mais je peux voir comment dans ce cas ce serait plus lisible. J'ai modifié la réponse et elle se lit maintenant comme vous l'avez suggéré.
Daniel Zohar le
42

Si vous utilisez des tables InnoDB, vous pouvez obtenir la taille des index individuels à partir de mysql.innodb_index_stats. La statistique 'size' contient la réponse, en pages, vous devez donc la multiplier par la taille de la page, qui est de 16K par défaut .

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';
Vajk Hermecz
la source
1
Fantastique. Exactement ce que je cherchais!
Dave Martorana
3
Pour clarifier: avec cette requête, le stat_valueest déjà multiplié par la taille de la page, donc la colonne donne la taille de l'index en octets.
Benedikt Köppel
2
Merci beaucoup mieux que la réponse acceptée. Une note pour les autres noobs comme moi - nom_base_de_données, nom_table et nom_index ne doivent pas être remplacés par votre vrai nom de base de données et nom de table;) à la place, la commande doit être utilisée exactement telle quelle.
luben
dans mon cas, il a donné une taille très différente (et irréaliste) de celle rapportée parshow table status from [dbname]
architectonique
6

Sur MyISAM, chaque bloc d'index est 4 KBrempli d'une page fill_factoravec des enregistrements d'index, chacun d'une key length + 4longueur d'octets.

Fill factor est normalement 2/3

Quant à InnoDB, la table est toujours clusterisée sur le PRIMARY KEY, il n'y a pas d' PRIMARY KEYindex séparé

Quassnoi
la source
6

Voici une adaptation de certains des éléments ci-dessus pour vous donner également le pourcentage de l'indice total de la table que chaque index a utilisé, j'espère que cela sera utile pour quelqu'un

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'

Exemple de sortie

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

Cordialement Liam

Liam Wheldon
la source
J'ai un cas particulier dans lequel, pour un index PK, le pourcentage affiche des valeurs supérieures à 100, comme 1844 ou 677. Je suppose qu'il y a un problème avec la requête pour ces cas.
Alex Pandrea
2

En utilisant phpMyAdmin, lors de l'affichage de la structure du tableau, il y a un lien Détails quelque part en bas. Une fois que vous cliquez dessus, il vous montrera la taille totale des index que vous avez sur la table où il est marqué Utilisation de l'espace.

Je ne pense pas que cela vous montre chaque index individuellement.

Peter D
la source
Avec phpMyAdmin, c'est vraiment simple. Merci!
MrFabio
1

À partir de la référence 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
la source