Come calcolare la dimensione degli indici in MySQL


88

Voglio determinare la dimensione dei miei indici, sono indici di chiave primaria. Questo sembra essere sul cluster mysql ma non penso che sia significativo.

Risposte:



76

Estendendo la risposta di Vajk Hermecz.
In questo modo è possibile ottenere tutte le dimensioni degli indici, in megabyte, senza PRIMARIO (che è la tabella stessa), ordinate per dimensione.

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
Perché ORDINARE PER 4?
Alex

1
@Alex quindi ordina per 4 ° campo, che è la dimensione. cioè mostra prima la tabella più grande, l'ultima più piccola
Daniel Zohar

1
Non è semplicemente meglio usare ORDER BY size_in_mb DESC;:?
NeverEndingQueue

1
@NeverEndingQueue è un po 'una questione di stile ma vedo come in questo caso sarebbe più leggibile. Ho modificato la risposta e ora si legge come hai suggerito.
Daniel Zohar

42

Se utilizzi tabelle InnoDB, puoi ottenere la dimensione per i singoli indici da mysql.innodb_index_stats. La statistica 'size' contiene la risposta, in pagine, quindi devi moltiplicarla per la dimensione della pagina, che è 16K per impostazione predefinita .

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

1
Fantastico. Esattamente quello che stavo cercando!
Dave Martorana

3
Per chiarire: con questa query, il stat_valueè già moltiplicato per la dimensione della pagina, quindi la colonna fornisce la dimensione dell'indice in byte.
Benedikt Köppel

2
Grazie, molto meglio della risposta accettata. Una nota per altri noob come me: database_name, table_name e index_name non devono essere sostituiti con il tuo vero nome di database e il nome di tabella;) invece il comando dovrebbe essere usato esattamente così com'è.
Luben

nel mio caso ha dato una dimensione molto diversa (e irrealistica) da quella riportata dashow table status from [dbname]
Architectonic

6

Sopra MyISAM ogni blocco di indice viene 4 KBriempita la pagina fill_factorcon record di indice, ciascuno della key length + 4lunghezza di byte.

Fill factor è normalmente 2/3

Per quanto riguarda InnoDB, la tabella è sempre raggruppata su PRIMARY KEY, non esiste un PRIMARY KEYindice separato


6

Ecco un adattamento da alcuni dei precedenti per darti anche la percentuale dell'indice totale per la tabella che ogni indice ha usato, si spera che questo sia utile per qualcuno

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'

Output di esempio

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

Saluti Liam


Ho un caso particolare in cui per un indice PK la percentuale mostra valori superiori a 100, come 1844 o 677. Immagino che ci sia un problema con la query per quei casi.
Alex Pandrea

2

Utilizzando phpMyAdmin, quando si visualizza la struttura della tabella c'è un collegamento Dettagli in basso da qualche parte. Una volta cliccato su di esso, ti mostrerà la dimensione totale degli indici che hai sulla tabella dove è contrassegnato Space Usage.

Non credo che ti mostri ogni indice individualmente.


Con phpMyAdmin è davvero facile. Grazie!
MrFabio


1

Dal riferimento a 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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.