Como descobrir o tamanho dos índices no MySQL


88

Quero determinar o tamanho dos meus índices, eles são índices de chave primária. Isso acontece no cluster mysql, mas não acho que seja significativo.

Respostas:



72

Estendendo a resposta de Vajk Hermecz.
É assim que você pode obter todos os tamanhos dos índices, em megabytes, sem o PRIMARY (que é a própria tabela), ordenados por tamanho.

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;

1
Por que ORDER BY 4?
Alex

1
@Alex então ordena pelo 4º campo, que é o tamanho. ou seja, mostrar a maior mesa primeiro, a menor por último
Daniel Zohar

1
Não é simplesmente melhor usar ORDER BY size_in_mb DESC;:?
NeverEndingQueue

1
@NeverEndingQueue é um pouco uma questão de estilo, mas posso ver como neste caso seria mais legível. Eu alterei a resposta e agora lê como você sugeriu.
Daniel Zohar

42

Se você estiver usando tabelas InnoDB, poderá obter o tamanho dos índices individuais de mysql.innodb_index_stats. A estatística de 'tamanho' contém a resposta, em páginas, então você deve multiplicá-la pelo tamanho da página, que é 16K por padrão .

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';

1
Fantástico. Exatamente o que eu estava procurando!
Dave Martorana,

3
Para esclarecer: Com esta consulta, o stat_valuejá é multiplicado pelo tamanho da página, então a coluna dá o tamanho do índice em bytes.
Benedikt Köppel,

2
Obrigado, muito melhor do que a resposta aceita. Uma nota para outros noobs como eu - database_name, table_name e index_name não devem ser substituídos pelo seu nome real do banco de dados e nome da tabela;) em vez disso, o comando deve ser usado exatamente como está.
luben

no meu caso, deu um tamanho muito diferente (e irrealista) do relatado porshow table status from [dbname]
arquitetônico

6

Ativado MyISAM, cada bloco de índice é 4 KBpreenchido por uma página fill_factorcom registros de índice, cada um contendo key length + 4bytes.

Fill factor é normalmente 2/3

Quanto a InnoDB, a tabela está sempre agrupada no PRIMARY KEY, não há PRIMARY KEYíndice separado


6

Aqui está uma adaptação de alguns dos itens acima para fornecer também a porcentagem do índice total da tabela que cada índice usou, espero que seja útil para alguém

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'

Saída de exemplo

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

Atenciosamente Liam


Tenho um caso específico em que, para índices PK, a Porcentagem mostra valores acima de 100, como 1844 ou 677. Acho que há um problema com a consulta para esses casos.
Alex Pandrea

2

Usando phpMyAdmin, ao visualizar a estrutura da tabela, há um link Detalhes em algum lugar na parte inferior. Depois de clicar nele, ele mostrará o tamanho total dos índices que você tem na tabela onde está marcado o uso de espaço.

Eu não acho que ele mostra cada índice individualmente.


Com o phpMyAdmin isso é realmente fácil. Obrigado!
MrFabio


1

Da referência do 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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.