ฉันสามารถเรียกใช้แบบสอบถามนี้เพื่อรับขนาดของตารางทั้งหมดในฐานข้อมูล MySQL:
show table status from myDatabaseName;
ฉันต้องการความช่วยเหลือในการทำความเข้าใจผลลัพธ์ ฉันกำลังมองหาตารางที่มีขนาดใหญ่ที่สุด
ฉันควรดูคอลัมน์ไหน
ฉันสามารถเรียกใช้แบบสอบถามนี้เพื่อรับขนาดของตารางทั้งหมดในฐานข้อมูล MySQL:
show table status from myDatabaseName;
ฉันต้องการความช่วยเหลือในการทำความเข้าใจผลลัพธ์ ฉันกำลังมองหาตารางที่มีขนาดใหญ่ที่สุด
ฉันควรดูคอลัมน์ไหน
คำตอบ:
คุณสามารถใช้แบบสอบถามนี้เพื่อแสดงขนาดของตาราง (แม้ว่าคุณจะต้องแทนที่ตัวแปรก่อน):
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;
AND table_name IN ('table_1', 'table_2', 'table_3');
VARCHAR
และBLOB
พิมพ์อย่างไร
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
คุณสามารถรับรายละเอียดเพิ่มเติมได้ที่นี่
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)
หากคุณต้องการให้แบบสอบถามใช้ฐานข้อมูลที่เลือกในปัจจุบัน เพียงคัดลอกวางแบบสอบถามนี้ (ไม่จำเป็นต้องดัดแปลง)
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;
SIZE_MB
จาก data_schema.TABLES ที่ table_schema = ฐานข้อมูล () ORDER BY (data_length + index_length) ASC;
มีวิธีง่ายๆในการรับข้อมูลมากมายโดยใช้ Workbench:
คลิกขวาที่ชื่อสคีมาแล้วคลิก "ผู้ตรวจสอบสคีมา"
ในหน้าต่างผลลัพธ์คุณมีแท็บจำนวนหนึ่ง แท็บแรก "ข้อมูล" แสดงการประมาณคร่าวๆของขนาดฐานข้อมูลเป็น MB
แท็บที่สอง "ตาราง" แสดงความยาวข้อมูลและรายละเอียดอื่น ๆ สำหรับแต่ละตาราง
ขนาดของตารางทั้งหมด:
สมมติว่าฐานข้อมูลหรือ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)
ลองใช้คำสั่งเชลล์ต่อไปนี้ (แทนที่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
นี่เป็นอีกวิธีในการแก้ไขปัญหานี้จากการใช้บรรทัดคำสั่ง 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
หากคุณใช้ phpmyadmin ให้ไปที่โครงสร้างตาราง
เช่น
Space usage
Data 1.5 MiB
Index 0 B
Total 1.5 Mi
ดัดแปลงมาจากคำตอบของ 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;
หากคุณมีssh
สิทธิ์เข้าถึงคุณอาจต้องการลองdu -hc /var/lib/mysql
(หรือแตกต่างกันdatadir
ตามที่ตั้งไว้ในmy.cnf
) ของคุณเช่นกัน
อีกวิธีในการแสดงจำนวนแถวและพื้นที่ที่ครอบครองและจัดเรียงโดย
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"
ฉันพบว่าคำตอบที่มีอยู่ไม่ได้ให้ขนาดของตารางในดิสก์ซึ่งมีประโยชน์มากกว่า แบบสอบถามนี้ให้การประมาณการดิสก์ที่แม่นยำยิ่งขึ้นเมื่อเทียบกับขนาดตารางตาม 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
คำนวณขนาดรวมของฐานข้อมูลในตอนท้าย:
(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"
)
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
สิ่งนี้ควรทดสอบใน 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;