MySQL'de Dizinlerin boyutu nasıl belirlenir


88

Dizinlerimin boyutunu belirlemek istiyorum, bunlar birincil anahtar dizinler. Bu mysql kümesinde oluyor ama bunun önemli olduğunu düşünmüyorum.

Yanıtlar:



76

Vajk Hermecz'in cevabını genişletiyoruz.
Bu, boyuta göre sıralanmış PRIMARY (tablonun kendisi) olmadan megabayt cinsinden tüm dizin boyutlarını elde etmenin yolu.

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
Neden 4 TARAFINDAN SİPARİŞ?
Alex

1
@Alex, boyut olan 4. alana göre sıralar. ör. en büyük tabloyu önce, en küçüğü son olarak göster
Daniel Zohar

1
Şunu kullanmak daha iyi değil ORDER BY size_in_mb DESC;mi?
NeverEndingQueue

1
@NeverEndingQueue biraz stil meselesi ama bu durumda daha okunaklı olacağını görebiliyorum. Cevabı değiştirdim ve şimdi önerdiğiniz gibi okunuyor.
Daniel Zohar

42

InnoDB tabloları kullanıyorsanız, tek tek dizinler için boyutu şuradan alabilirsiniz mysql.innodb_index_stats. "Boyut" istatistiği, cevabı sayfalar halinde içerir, bu nedenle bunu varsayılan olarak 16K olan sayfa boyutuyla çarpmanız gerekir .

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

1
Fantastik. Tam olarak aradığım şey!
Dave Martorana

3
Açıklığa kavuşturmak için: Bu sorgu ile, stat_valuezaten sayfa boyutuyla çarpılır, bu nedenle sütun, bayt cinsinden dizin boyutunu verir.
Benedikt Köppel

2
Teşekkür ederim, kabul edilen cevaptan çok daha iyi. Benim gibi diğer nooblar için bir not - veritabanı_adı, tablo_adı ve dizin_adı gerçek veritabanı adınız ve tablo adınızla değiştirilmemelidir;) bunun yerine komut tam olarak olduğu gibi kullanılmalıdır.
luben

benim durumumda o tarafından bildirilen sayıdan çok daha farklı (ve gerçekçi olmayan) büyüklüğünü verdishow table status from [dbname]
mimari

6

Tarihinde MyISAM, her bir dizin bloğu , her biri bayt uzunluğunda olan dizin kayıtları ile 4 KBdoldurulur .fill_factorkey length + 4

Fill factor normalde 2/3

Gelince InnoDB, masa her zaman açık kümelenmiş PRIMARY KEY, ayrı yoktur PRIMARY KEYendeksi


6

İşte size her bir dizinin kullandığı tablonun toplam endeks yüzdesini vermek için yukarıdakilerden bazılarından bir uyarlama, umarım bu birileri için yararlı olur

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'

Örnek çıktı

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

Saygılarımızla Liam


Bir PK indeksleri için Yüzde'nin 1844 veya 677 gibi 100'ün üzerindeki değerleri gösterdiği özel bir durumum var. Sanırım bu durumlar için sorguda bir sorun var.
Alex Pandrea

2

PhpMyAdmin'i kullanarak, tablo yapısını görüntülerken, altta bir yerde Ayrıntılar bağlantısı vardır. Üzerine tıkladığınızda size Alan Kullanımı olarak işaretlenmiş olan tabloda sahip olduğunuz dizinlerin toplam boyutunu gösterecektir.

Yine de size her dizini ayrı ayrı gösterdiğini sanmıyorum.


PhpMyAdmin ile bu gerçekten çok kolay. Teşekkür ederim!
MrFabio


1

MySQL 5.6 referansından

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.