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.

Brian G
fonte

Respostas:

99

Acho que é isso que você está procurando.

show table status from [dbname]

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

Josh Warner-Burke
fonte
2
Avg_row_length, Data_length, Max_data_length, Index_length, Data_free são todos relatados em bytes, sim.
Luke Rehmann
23
Isso dá o tamanho total do índice, não um tamanho por índice (assumindo que uma tabela tenha vários índices).
Sai de
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;
Daniel Zohar
fonte
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';
Vajk Hermecz
fonte
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

Quassnoi
fonte
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

Liam Wheldon
fonte
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.

Peter D
fonte
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;
viggy28
fonte