MySQL veritabanı tablolarının boyutları nasıl alınır?


900

Bir MySQL veritabanındaki tüm tabloların boyutlarını almak için bu sorguyu çalıştırabilirsiniz:

show table status from myDatabaseName;

Sonuçları anlamada yardım istiyorum. En büyük boyutlara sahip tablolar arıyorum.

Hangi sütuna bakmalıyım?


8
Boyut olarak ne demek istiyorsun? Satır sayısı? Diskte alınan baytlar?
Mark Byers

@ Mark disk üzerinde boyut istiyorum bu doğru yöntem mi? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
Bu ilgi ise İlgili, ben bir yazdı Tüm Tablolar açıklayın içinde bu Yanıt .
Drew

Yanıtlar:


1958

Bir tablonun boyutunu göstermek için bu sorguyu kullanabilirsiniz (önce değişkenleri değiştirmeniz gerekir):

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME"
    AND table_name = "$TABLE_NAME";

veya her sorgudaki her tablonun boyutunu listelemek için bu sorguyu, en büyüğü:

SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
ORDER BY (data_length + index_length) DESC;

3
Teşekkürler, onun iyi çalışıyor, ancak Blobs dikkate alır emin değilim.
David

5
Not, birden fazla tablo belirtmek için de "IN" kullanabilirsiniz, örneğinAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, bu yalnızca statik boyut alanlarının uzunluklarını doğru olarak sayar. Nasıl sayılır VARCHARve BLOByazılır?
l0b0

3
@kasimir Bir noktada dünya kafa karıştırdı ve bazı standart organizasyonları ve donanım üreticileri ondalık sistemde bir kilobayt tanımlanmasının daha iyi olduğuna karar verdi. IEC standardı şimdi tabana 2 kilobayt (1024 bayt) bir kibibit (KiB) diyor. Her halükarda, MySQL bilmiyor, bu yüzden IEC ondalık kilobayt istiyorsanız, 1000'e bölün.
russellpierce

9
Bu InnoDB depolama motoru için işe yarar mı? Buradaki mysql doc - dev.mysql.com/doc/refman/5.7/en/show-table-status.html dosyasına göre , bu motorun data_length alanı kümelenmiş dizinin boyutunu içerir. Bu, verilerin boyutunu doğru bir şekilde temsil etmez. Olur mu?
euphoria83

96
SELECT TABLE_NAME AS "Table Name", 
table_rows AS "Quant of Rows", ROUND( (
data_length + index_length
) /1024, 2 ) AS "Total Size Kb"
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'YOUR SCHEMA NAME/DATABASE NAME HERE'
LIMIT 0 , 30

Şema adını " information_schema " -> SCHEMATA tablosu -> " SCHEMA_NAME " sütunundan alabilirsiniz


Ek Aşağıdaki gibi mysql veritabanlarının boyutunu alabilirsiniz .

SELECT table_schema "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

Sonuç

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

Daha fazla bilgiyi buradan edinebilirsiniz.


41
SELECT 
    table_name AS "Table",  
    round(((data_length + index_length) / 1024 / 1024), 2) as size   
FROM information_schema.TABLES  
WHERE table_schema = "YOUR_DATABASE_NAME"  
ORDER BY size DESC; 

Bu boyutları (MB olarak DB Boyutu) sıralar.


31

Sorgunun seçili olan veritabanını kullanmasını istiyorsanız. bu sorguyu kopyalayıp yapıştırmanız yeterlidir. (Değişiklik gerekmez)

SELECT table_name ,
  round(((data_length + index_length) / 1024 / 1024), 2) as SIZE_MB
FROM information_schema.TABLES
WHERE table_schema = DATABASE() ORDER BY SIZE_MB DESC;

5
Ya da daha kısa (alt sorgu olmadan): SELECT table_name, round (((data_length + index_length) / 1024/1024), 2) SIZE_MBFROM information_schema.TABLES WHERE table_schema = DATABASE () SİPARİŞ (data_length + index_length) ASC;
Onkeltem

15

Workbench kullanarak birçok bilgi edinmenin kolay bir yolu vardır:

  • Şema adını sağ tıklatın ve "Şema denetçisi" ni tıklatın.

  • Ortaya çıkan pencerede birkaç sekmeniz vardır. İlk sekme "Bilgi", MB cinsinden veritabanı boyutunun kabaca bir tahminini gösterir.

  • İkinci sekme olan "Tablolar", Veri uzunluğu ve her tablo için diğer ayrıntıları gösterir.


Mac istemcim v 6.0.9'da 'bilgi' sekmesine sahip değildim
Neil

Harika!!! MySQL Workbench'te her tablo için bir "Table Inspector" da vardır. Düzgün hızlı değil ama çok kullanışlı!
T30

11
  • Tüm tabloların boyutu:

    Veritabanınızın veya TABLE_SCHEMAadınızın "news_alert" olduğunu varsayalım . Sonra bu sorgu veritabanındaki tüm tabloların boyutunu gösterecektir.

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
      TABLE_SCHEMA = "news_alert"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    Çıktı:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • Belirli bir tablo için:

    Senin varsayalım TABLE_NAMEIS "haber" . Sonra SQL sorgusu

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
        TABLE_SCHEMA = "news_alert"
      AND
        TABLE_NAME = "news"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    Çıktı:

    +-------+-----------+
    | Table | Size (MB) |
    +-------+-----------+
    | news  |      0.08 |
    +-------+-----------+
    1 row in set (0.00 sec)

8

Aşağıdaki kabuk komutunu deneyin ( DB_NAMEveritabanı adınızla değiştirin ):

mysql -uroot <<<"SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"DB_NAME\" ORDER BY (data_length + index_length) DESC;" | head

Drupal / drush çözümü için, kullanımdaki en büyük tabloları görüntüleyecek aşağıdaki örnek komut dosyasını kontrol edin:

#!/bin/sh
DB_NAME=$(drush status --fields=db-name --field-labels=0 | tr -d '\r\n ')
drush sqlq "SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"${DB_NAME}\" ORDER BY (data_length + index_length) DESC;" | head -n20

6

Heres bunu bash komut satırını kullanmanın bir başka yolu.

for i in mysql -NB -e 'show databases'; do echo $i; mysql -e "SELECT table_name AS 'Tables', round(((data_length+index_length)/1024/1024),2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema =\"$i\" ORDER BY (data_length + index_length) DESC" ; done


6

Eğer phpmyadmin kullanıyorsanız tablo yapısına gidin

Örneğin

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

ChapMic'in benim özel ihtiyacım olan cevabından uyarlandı.

Yalnızca veritabanı adınızı belirtin, ardından tüm tabloları seçili veritabanı içindeki EN BÜYÜK'den KÜÇÜK tabloya kadar azalan sırada sıralayın. Yalnızca 1 değişkenin değiştirilmesi gerekiyor = veritabanı adınız.

SELECT 
table_name AS `Table`, 
round(((data_length + index_length) / 1024 / 1024), 2) AS `size`
FROM information_schema.TABLES 
WHERE table_schema = "YOUR_DATABASE_NAME_HERE"
ORDER BY size DESC;

3

sshErişiminiz varsa , basitçe denemenizi du -hc /var/lib/mysql(veya datadirsizin ayarladığınız şekilde farklı) da deneyebilirsiniz my.cnf.


Son olarak bilgi_semalarına dayanmayan bir cevap. Benim durumumda, dosya sistemindeki gerçek boyut 1.8GB iken 660MB bildirdi
php_nub_qq

2

Satır sayısını ve işgal ettiği alanı ve siparişini vermenin başka bir yolu.

SELECT
     table_schema as `Database`,
     table_name AS `Table`,
     table_rows AS "Quant of Rows",
     round(((data_length + index_length) / 1024 / 1024/ 1024), 2) `Size in GB`
FROM information_schema.TABLES
WHERE table_schema = 'yourDatabaseName'
ORDER BY (data_length + index_length) DESC;  

Bu sorguda değiştirmek zorunda olduğunuz tek dize "VeritabanınızAdı" dır.


2

Mevcut cevapların aslında diskteki tabloların boyutunu vermediğini görüyorum, bu da daha yararlıdır. Bu sorgu, veri_uzunluğu ve dizine dayalı olarak tablo boyutuna kıyasla daha doğru disk tahmini sağlar. Diski fiziksel olarak inceleyip dosya boyutlarını kontrol edemediğiniz bir AWS RDS örneği için kullanmak zorunda kaldım.

select NAME as TABLENAME,FILE_SIZE/(1024*1024*1024) as ACTUAL_FILE_SIZE_GB
, round(((data_length + index_length) / 1024 / 1024/1024), 2) as REPORTED_TABLE_SIZE_GB 
from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES s
join INFORMATION_SCHEMA.TABLES t 
on NAME = Concat(table_schema,'/',table_name)
order by FILE_SIZE desc

1

Sonunda veritabanının toplam boyutunu hesaplayın:

(SELECT 
  table_name AS `Table`, 
  round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)
UNION ALL
(SELECT 
  'TOTAL:',
  SUM(round(((data_length + index_length) / 1024 / 1024), 2) )
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)

1
SELECT TABLE_NAME AS table_name, 
table_rows AS QuantofRows, 
ROUND((data_length + index_length) /1024, 2 ) AS total_size_kb 
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'db'
ORDER BY (data_length + index_length) DESC; 

yukarıdaki tüm 2 mysql üzerinde test edilmiştir


1

Bu postgresql değil, mysql içinde test edilmelidir:

SELECT table_schema, # "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) # "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

Bu, yazarların sorusunu cevaplasa da, açıklayıcı kelimeler ve / veya belgelere bağlantılar içermez. Ham kod parçacıkları, çevrelerindeki bazı ifadeler olmadan çok yararlı değildir. Ayrıca bulabilirsiniz iyi bir cevap yazmayı çok yararlı. Lütfen yanıtınızı düzenleyin - Yorumdan
Nick

@Nick neden hala yasaklandı?
William

Üzgünüm, bunun cevabını bilmiyorum - moderatör değilim.
Nick
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.