Cara mengetahui ukuran Indeks di MySQL

88

Saya ingin menentukan ukuran indeks saya, mereka adalah indeks kunci utama. Ini kebetulan berada di cluster mysql tetapi saya tidak berpikir itu signifikan.

Brian G
sumber

Jawaban:

100

Saya pikir inilah yang Anda cari.

show table status from [dbname]

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

Josh Warner-Burke
sumber
2
Avg_row_length, Data_length, Max_data_length, Index_length, Data_free semuanya dilaporkan dalam byte, ya.
Luke Rehmann
23
Ini memberikan ukuran indeks total , bukan ukuran per indeks (dengan asumsi tabel memiliki beberapa indeks).
Sai
76

Memperluas jawaban Vajk Hermecz.
Ini adalah bagaimana Anda bisa mendapatkan semua ukuran indeks, dalam megabyte, tanpa PRIMARY (yang merupakan tabel itu sendiri), diurutkan berdasarkan ukuran.

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
sumber
1
Mengapa ORDER BY 4?
Alex
1
@Alex jadi memesan berdasarkan kolom ke-4, yang merupakan ukuran. yaitu tunjukkan tabel terbesar pertama, terkecil terakhir
Daniel Zohar
1
Bukankah lebih baik menggunakan ORDER BY size_in_mb DESC;:?
NeverEndingQueue
1
@NeverEndingQueue ini sedikit masalah gaya, tetapi saya dapat melihat bagaimana dalam hal ini akan lebih mudah dibaca. Saya telah mengubah jawabannya dan sekarang terbaca seperti yang Anda sarankan.
Daniel Zohar
42

Jika Anda menggunakan tabel InnoDB, Anda bisa mendapatkan ukuran untuk masing-masing indeks dari mysql.innodb_index_stats. Stat 'size' berisi jawabannya, dalam halaman, jadi Anda harus mengalikannya dengan ukuran halaman, yaitu 16K secara default .

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';
Vajk Hermecz
sumber
1
Fantastis. Persis apa yang saya cari!
Dave Martorana
3
Untuk memperjelas: Dengan kueri ini, stat_valueitu sudah dikalikan dengan ukuran halaman, sehingga kolom memberikan ukuran indeks dalam byte.
Benedikt Köppel
2
Terima kasih, jauh lebih baik daripada jawaban yang diterima. Catatan untuk noob lain seperti saya - nama_database, nama_tabel, dan nama_indeks tidak boleh diganti dengan nama database dan nama tabel asli Anda;) alih-alih perintah harus digunakan persis seperti apa adanya.
luben
dalam kasus saya itu memberikan ukuran yang sangat berbeda (dan tidak realistis) dari yang dilaporkan olehshow table status from [dbname]
arsitektonis
6

Pada MyISAM, setiap blok indeks adalah 4 KBhalaman yang diisi fill_factordengan catatan indeks, masing-masing key length + 4panjangnya byte.

Fill factor biasanya 2/3

Adapun InnoDB, tabel selalu berkerumun di atas PRIMARY KEY, tidak ada PRIMARY KEYindeks terpisah

Quassnoi
sumber
6

Berikut ini adalah adaptasi dari beberapa hal di atas juga untuk memberikan anda persentase dari total index untuk tabel yang telah digunakan masing-masing index, semoga bermanfaat bagi sobat.

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'

Contoh keluaran

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

Salam Liam

Liam Wheldon
sumber
Saya memiliki kasus tertentu di mana untuk indeks PK Persentase menunjukkan nilai lebih dari 100, seperti 1844 atau 677. Saya kira ada masalah dengan kueri untuk kasus tersebut.
Alex Pandrea
2

Menggunakan phpMyAdmin, saat melihat struktur tabel ada tautan Detail di suatu tempat di bawah. Setelah Anda mengkliknya, itu akan menunjukkan kepada Anda ukuran total indeks yang Anda miliki di tabel yang ditandai Penggunaan Ruang.

Saya tidak berpikir itu menunjukkan kepada Anda setiap indeks secara individual.

Peter D
sumber
Dengan phpMyAdmin itu sangat mudah. Terima kasih!
MrFabio
1

Dari referensi 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
sumber