Bagaimana cara mendapatkan ukuran tabel dari database MySQL?


900

Saya bisa menjalankan kueri ini untuk mendapatkan ukuran semua tabel di database MySQL:

show table status from myDatabaseName;

Saya ingin bantuan dalam memahami hasilnya. Saya mencari meja dengan ukuran terbesar.

Kolom mana yang harus saya lihat?


8
Apa yang Anda maksud dengan ukuran? Jumlah baris? Bytes diambil pada disk?
Mark Byers

@ Mark saya ingin ukuran pada disk adalah metode yang benar ini? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
Terkait, jika itu menarik, saya menulis Jelaskan Semua Tabel dalam Jawaban ini .
Drew

Jawaban:


1958

Anda dapat menggunakan kueri ini untuk menampilkan ukuran tabel (meskipun Anda harus mengganti variabel terlebih dahulu):

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";

atau kueri ini untuk mencantumkan ukuran setiap tabel di setiap basis data, terbesar terlebih dahulu:

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
Terima kasih, ini bekerja dengan baik, meskipun saya tidak yakin itu perlu dipertimbangkan.
David

5
Catatan, Anda juga dapat menggunakan "IN" untuk menentukan beberapa tabel, misalnyaAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, ini hanya akan menghitung panjang bidang ukuran statis dengan benar. Bagaimana Anda menghitung VARCHARdan BLOBmengetik?
l0b0

3
@kasimir Di beberapa titik dunia menjadi membingungkan dan beberapa organisasi standar dan produsen perangkat keras memutuskan bahwa lebih baik satu kilobyte ditentukan pada sistem desimal. Standar IEC sekarang menyebut basis 2 kilobyte (1024 bytes) a kibibyte (KiB). Bagaimanapun, MySQL tidak tahu, jadi jika Anda ingin kilobyte desimal IEC, bagi dengan 1000.
russellpierce

9
Apakah ini akan bekerja untuk mesin penyimpanan InnoDB? Menurut dokumen mysql di sini - dev.mysql.com/doc/refman/5.7/en/show-table-status.html , bidang data_length untuk mesin tersebut berisi ukuran indeks berkerumun. Itu tidak akan secara benar mewakili ukuran data. Akankah itu?
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

Anda bisa mendapatkan nama skema dari " information_schema " -> tabel SCHEMATA -> kolom " SCHEMA_NAME "


Tambahan Anda bisa mendapatkan ukuran database mysql sebagai berikut.

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; 

Hasil

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

Anda bisa mendapatkan detail tambahan di sini.


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; 

Ini mengurutkan ukuran (Ukuran DB dalam MB).


31

Jika Anda ingin kueri menggunakan database yang saat ini dipilih. cukup salin tempelkan kueri ini. (Tidak perlu modifikasi)

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
Atau bahkan lebih pendek (tanpa subquery): SELECT table_name, round (((data_length + index_length) / 1024/1024), 2) SIZE_MBFROM information_schema.TABLES WHERE table_schema = DATABASE () ORDER BY (data_length + index_length) ASC;
Onkeltem

15

Ada cara mudah untuk mendapatkan banyak informasi menggunakan Workbench:

  • Klik kanan nama skema dan klik "Inspektur skema".

  • Di jendela yang dihasilkan Anda memiliki sejumlah tab. Tab pertama "Info" menunjukkan perkiraan kasar ukuran database dalam MB.

  • Tab kedua, "Tabel", menunjukkan Panjang data dan detail lainnya untuk setiap tabel.


Saya tidak memiliki tab 'info' pada klien Mac saya v 6.0.9
Neil

Bagus!!! Di MySQL Workbench ada juga "Table Inspector" untuk setiap tabel. Tidak terlalu cepat tapi sangat berguna!
T30

11
  • Ukuran semua tabel:

    Misalkan database atau TABLE_SCHEMAnama Anda adalah "news_alert". Maka permintaan ini akan menampilkan ukuran semua tabel dalam database.

    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;

    Keluaran:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • Untuk tabel spesifik:

    Misalkan Anda TABLE_NAMEadalah "berita" . Maka query SQL akan menjadi-

    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;

    Keluaran:

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

8

Coba perintah shell berikut (ganti DB_NAMEdengan nama database Anda):

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

Untuk solusi Drupal / drush, periksa contoh skrip berikut yang akan menampilkan tabel terbesar yang digunakan:

#!/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

Inilah cara lain untuk menyelesaikan hal ini dari menggunakan baris perintah bash.

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

Jika Anda menggunakan phpmyadmin maka cukup buka struktur tabel

misalnya

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

Diadaptasi dari jawaban ChapMic untuk menyesuaikan kebutuhan khusus saya.

Hanya tentukan nama basis data Anda, kemudian urutkan semua tabel dalam urutan menurun - dari tabel LARGEST ke SMALLEST di dalam basis data yang dipilih. Hanya perlu 1 variabel untuk diganti = nama basis data Anda.

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

Jika Anda memiliki sshakses, Anda mungkin ingin mencoba du -hc /var/lib/mysql(atau berbeda datadir, seperti yang diatur dalam Anda my.cnf) juga.


Akhirnya jawaban yang tidak bergantung pada information_schema. Dalam kasus saya ini melaporkan 660MB sedangkan ukuran aktual pada sistem file adalah 1,8GB
php_nub_qq

2

Cara lain untuk menunjukkan jumlah baris dan ruang yang ditempati dan dipesan olehnya.

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;  

Satu-satunya string yang harus Anda ganti dalam kueri ini adalah "yourDatabaseName".


2

Saya menemukan jawaban yang ada sebenarnya tidak memberikan ukuran tabel pada disk, yang mana lebih membantu. Kueri ini memberikan perkiraan disk yang lebih akurat dibandingkan dengan ukuran tabel berdasarkan data_length & index. Saya harus menggunakan ini untuk instance AWS RDS di mana Anda tidak dapat secara fisik memeriksa disk dan memeriksa ukuran file.

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

Hitung ukuran total database di akhir:

(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; 

semua 2 di atas diuji pada mysql


1

Ini harus diuji dalam mysql, bukan postgresql:

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; 

Meskipun ini mungkin menjawab pertanyaan penulis, tidak ada beberapa kata yang menjelaskan dan / atau tautan ke dokumentasi. Cuplikan kode mentah tidak sangat membantu tanpa frasa di sekitarnya. Anda juga dapat menemukan cara menulis jawaban yang baik sangat membantu. Harap edit jawaban Anda - Dari Ulasan
Nick

@Nick kenapa masih diblokir?
William

Maaf, saya tidak tahu jawabannya - saya bukan moderator.
Nick
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.