วิธีรับขนาดของตารางของฐานข้อมูล MySQL?


900

ฉันสามารถเรียกใช้แบบสอบถามนี้เพื่อรับขนาดของตารางทั้งหมดในฐานข้อมูล MySQL:

show table status from myDatabaseName;

ฉันต้องการความช่วยเหลือในการทำความเข้าใจผลลัพธ์ ฉันกำลังมองหาตารางที่มีขนาดใหญ่ที่สุด

ฉันควรดูคอลัมน์ไหน


8
คุณหมายถึงอะไรตามขนาด จำนวนแถว? จำนวนไบต์บนดิสก์?
Mark Byers

@ มาร์คฉันต้องการขนาดบนดิสก์เป็นวิธีที่ถูกต้องหรือไม่ # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
ที่เกี่ยวข้องถ้าเป็นเรื่องที่น่าสนใจฉันเขียนคำอธิบายตารางทั้งหมดในคำตอบนี้
ดึง

คำตอบ:


1958

คุณสามารถใช้แบบสอบถามนี้เพื่อแสดงขนาดของตาราง (แม้ว่าคุณจะต้องแทนที่ตัวแปรก่อน):

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

หรือแบบสอบถามนี้เพื่อแสดงขนาดของทุกตารางในทุกฐานข้อมูลใหญ่ที่สุดก่อน:

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
ขอขอบคุณมันใช้งานได้ดีแม้ว่าฉันจะไม่แน่ใจว่าต้องคำนึงถึง Blobs
David

5
หมายเหตุคุณสามารถใช้ "IN" เพื่อระบุหลายตารางเช่นAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT ซึ่งจะนับความยาวของฟิลด์ขนาดคงที่อย่างถูกต้องเท่านั้น คุณจะนับVARCHARและBLOBพิมพ์อย่างไร
l0b0

3
@ kasimir ณ จุดหนึ่งของโลกที่มีความสับสนและบางองค์กรมาตรฐานและผู้ผลิตฮาร์ดแวร์ตัดสินใจว่ามันจะดีกว่าที่จะกำหนดกิโลไบต์บนระบบทศนิยม มาตรฐาน IEC ตอนนี้เรียกฐาน 2 กิโลไบต์ (1024 ไบต์) kibibyte (KiB) ไม่ว่าจะด้วยวิธีใดก็ตาม MySQL ไม่ทราบดังนั้นหากคุณต้องการ IEC ทศนิยมกิโลไบต์หารด้วย 1,000
russellpierce

9
สิ่งนี้จะทำงานกับเอ็นจิ้นการจัดเก็บ InnoDB ได้หรือไม่? อ้างอิงจาก mysql doc ที่นี่ - dev.mysql.com/doc/refman/5.7/en/show-table-status.htmlฟิลด์ data_length สำหรับเอ็นจิ้นนั้นมีขนาดของดัชนีคลัสเตอร์ นั่นจะไม่แสดงขนาดของข้อมูลอย่างถูกต้อง มันจะ?
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

คุณสามารถรับชื่อสคีมาได้จาก " information_schema " -> ตารางSCHEMATA -> คอลัมน์ " SCHEMA_NAME "


เพิ่มเติม คุณสามารถรับขนาดของฐานข้อมูล mysql ได้ดังต่อไปนี้

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; 

ผลลัพธ์

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

คุณสามารถรับรายละเอียดเพิ่มเติมได้ที่นี่


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; 

สิ่งนี้จะเรียงขนาด (DB Size เป็น MB)


31

หากคุณต้องการให้แบบสอบถามใช้ฐานข้อมูลที่เลือกในปัจจุบัน เพียงคัดลอกวางแบบสอบถามนี้ (ไม่จำเป็นต้องดัดแปลง)

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
หรือสั้นกว่า (โดยไม่มีแบบสอบถามย่อย): เลือก table_name, round ((data_length + index_length) / 1024/1024), 2) SIZE_MBจาก data_schema.TABLES ที่ table_schema = ฐานข้อมูล () ORDER BY (data_length + index_length) ASC;
Onkeltem

15

มีวิธีง่ายๆในการรับข้อมูลมากมายโดยใช้ Workbench:

  • คลิกขวาที่ชื่อสคีมาแล้วคลิก "ผู้ตรวจสอบสคีมา"

  • ในหน้าต่างผลลัพธ์คุณมีแท็บจำนวนหนึ่ง แท็บแรก "ข้อมูล" แสดงการประมาณคร่าวๆของขนาดฐานข้อมูลเป็น MB

  • แท็บที่สอง "ตาราง" แสดงความยาวข้อมูลและรายละเอียดอื่น ๆ สำหรับแต่ละตาราง


ฉันไม่มีแท็บ 'ข้อมูล' บนไคลเอ็นต์ Mac v 6.0.9
Neil

ยิ่งใหญ่ !!! ใน MySQL Workbench ยังมี "Table Inspector" สำหรับแต่ละตาราง ไม่เร็วนัก แต่มีประโยชน์มาก!
T30

11
  • ขนาดของตารางทั้งหมด:

    สมมติว่าฐานข้อมูลหรือTABLE_SCHEMAชื่อของคุณคือ"news_alert" จากนั้นแบบสอบถามนี้จะแสดงขนาดของตารางทั้งหมดในฐานข้อมูล

    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;

    เอาท์พุท:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • สำหรับตารางเฉพาะ:

    สมมติว่าคุณTABLE_NAMEมี"ข่าว" จากนั้นแบบสอบถาม SQL จะเป็น -

    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;

    เอาท์พุท:

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

8

ลองใช้คำสั่งเชลล์ต่อไปนี้ (แทนที่DB_NAMEด้วยชื่อฐานข้อมูลของคุณ):

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 ให้ตรวจสอบสคริปต์ตัวอย่างต่อไปนี้ซึ่งจะแสดงตารางที่ใหญ่ที่สุดที่ใช้งานอยู่:

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

นี่เป็นอีกวิธีในการแก้ไขปัญหานี้จากการใช้บรรทัดคำสั่ง 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

หากคุณใช้ phpmyadmin ให้ไปที่โครงสร้างตาราง

เช่น

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

ดัดแปลงมาจากคำตอบของ ChapMic เพื่อตอบสนองความต้องการเฉพาะของฉัน

ระบุชื่อฐานข้อมูลของคุณเท่านั้นจากนั้นเรียงลำดับตารางทั้งหมดตามลำดับจากมากไปน้อย - จากตาราง LARGEST ถึง SMALLEST ภายในฐานข้อมูลที่เลือก ต้องการเพียง 1 ตัวแปรที่จะถูกแทนที่ = ชื่อฐานข้อมูลของคุณ

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

หากคุณมีsshสิทธิ์เข้าถึงคุณอาจต้องการลองdu -hc /var/lib/mysql(หรือแตกต่างกันdatadirตามที่ตั้งไว้ในmy.cnf) ของคุณเช่นกัน


ในที่สุดคำตอบที่ไม่ต้องพึ่งพา information_schema ในกรณีของฉันมันรายงาน 660MB ในขณะที่ขนาดที่แท้จริงในระบบแฟ้มเป็น 1.8GB
php_nub_qq

2

อีกวิธีในการแสดงจำนวนแถวและพื้นที่ที่ครอบครองและจัดเรียงโดย

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;  

สตริงเดียวที่คุณต้องแทนที่ในแบบสอบถามนี้คือ "yourDatabaseName"


2

ฉันพบว่าคำตอบที่มีอยู่ไม่ได้ให้ขนาดของตารางในดิสก์ซึ่งมีประโยชน์มากกว่า แบบสอบถามนี้ให้การประมาณการดิสก์ที่แม่นยำยิ่งขึ้นเมื่อเทียบกับขนาดตารางตาม data_length & index ฉันต้องใช้สิ่งนี้สำหรับอินสแตนซ์ AWS RDS ซึ่งคุณไม่สามารถตรวจสอบดิสก์และตรวจสอบขนาดไฟล์ได้

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

คำนวณขนาดรวมของฐานข้อมูลในตอนท้าย:

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

ทั้ง 2 ข้อได้รับการทดสอบบน mysql


1

สิ่งนี้ควรทดสอบใน mysql ไม่ใช่ 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; 

แม้ว่าสิ่งนี้อาจตอบคำถามผู้แต่ง แต่ก็ไม่มีคำอธิบายและ / หรือลิงก์ไปยังเอกสารประกอบ ข้อมูลโค้ดดิบนั้นไม่ค่อยมีประโยชน์หากไม่มีวลีอยู่รอบตัว คุณอาจพบว่าวิธีเขียนคำตอบที่ดีมีประโยชน์มาก โปรดแก้ไขคำตอบของคุณ - จากรีวิว
Nick

@Nick ทำไมยังคงถูกแบน?
วิลเลียม

ขออภัยฉันไม่ทราบคำตอบว่า - ฉันไม่ใช่ผู้ดูแล
Nick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.