Làm thế nào để có được kích thước của các bảng của cơ sở dữ liệu MySQL?


900

Tôi có thể chạy truy vấn này để lấy kích thước của tất cả các bảng trong cơ sở dữ liệu MySQL:

show table status from myDatabaseName;

Tôi muốn một số trợ giúp để hiểu kết quả. Tôi đang tìm kiếm các bảng với kích thước lớn nhất.

Tôi nên xem cột nào?


8
Bạn có ý nghĩa gì bởi kích thước? Số hàng? Byte lấy trên đĩa?
Mark Byers

@Mark tôi muốn kích thước trên đĩa là phương pháp này phải không? # Du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
Liên quan, nếu nó quan tâm, tôi đã viết Mô tả tất cả các bảng trong câu trả lời này .
vẽ

Câu trả lời:


1958

Bạn có thể sử dụng truy vấn này để hiển thị kích thước của bảng (mặc dù trước tiên bạn cần thay thế các biế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"
    AND table_name = "$TABLE_NAME";

hoặc truy vấn này để liệt kê kích thước của mỗi bảng trong mọi cơ sở dữ liệu, lớn nhất trước tiên:

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
Cảm ơn bạn, nó hoạt động tốt, mặc dù tôi không chắc chắn rằng nó cần Blobs xem xét.
David

5
Lưu ý, bạn cũng có thể sử dụng "IN" để chỉ định nhiều bảng, ví dụ:AND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, điều này sẽ chỉ tính chính xác độ dài của các trường kích thước tĩnh. Làm thế nào bạn sẽ đếm VARCHARBLOBcác loại?
l0b0

3
@kasimir Tại một số thời điểm, thế giới trở nên khó hiểu và một số tổ chức tiêu chuẩn và nhà sản xuất phần cứng quyết định rằng tốt hơn là một kilobyte được xác định trên hệ thống thập phân. Hiện tại, tiêu chuẩn IEC gọi cơ sở 2 kilobyte (1024 byte) là kibibyte (KiB). Ở bất cứ giá nào, MySQL không biết, vì vậy nếu bạn muốn kilobyte thập phân IEC, chia cho 1000.
russellpierce

9
Điều này sẽ làm việc cho công cụ lưu trữ InnoDB? Theo tài liệu mysql ở đây - dev.mysql.com/doc/refman/5.7/en/show-table-status.html , trường data_length cho công cụ đó chứa kích thước của chỉ mục được nhóm. Điều đó sẽ không thể hiện chính xác kích thước của dữ liệu. Sẽ không
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

Bạn có thể lấy tên lược đồ từ " information_schema " -> bảng SCHEMATA -> cột " SCHema_NAME "


Bổ sung Bạn có thể lấy kích thước của cơ sở dữ liệu mysql như sau.

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; 

Kết quả

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

Bạn có thể nhận thêm chi tiết tại đây.


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; 

Điều này sắp xếp các kích thước (Kích thước DB tính bằng MB).


31

Nếu bạn muốn một truy vấn để sử dụng cơ sở dữ liệu hiện được chọn. chỉ cần sao chép dán truy vấn này. (Không cần sửa đổi)

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
Hoặc thậm chí ngắn hơn (không có truy vấn con): CHỌN tên_bảng, vòng (((data_length + index_length) / 1024/1024), 2) SIZE_MBTỪ information_schema.TABLES WHERE table_schema = DATABASE () ORDER BY (data_length + index_length
Onkeltem

15

Có một cách dễ dàng để có được nhiều thông tin bằng Workbench:

  • Bấm chuột phải vào tên lược đồ và bấm "Trình kiểm tra lược đồ".

  • Trong cửa sổ kết quả, bạn có một số tab. Tab đầu tiên "Thông tin" hiển thị ước tính sơ bộ về kích thước cơ sở dữ liệu tính bằng MB.

  • Tab thứ hai, "Bảng", hiển thị Độ dài dữ liệu và các chi tiết khác cho mỗi bảng.


Tôi không có tab 'thông tin' trên máy khách Mac của mình v 6.0.9
Neil

Tuyệt quá!!! Trong MySQL Workbench cũng có một "Trình kiểm tra bảng" cho mỗi bảng. Không đúng cách nhanh chóng nhưng rất tiện dụng!
T30

11
  • Kích thước của tất cả các bảng:

    Giả sử cơ sở dữ liệu hoặc TABLE_SCHEMAtên của bạn là "news_alert". Sau đó, truy vấn này sẽ hiển thị kích thước của tất cả các bảng trong cơ sở dữ liệu.

    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;

    Đầu ra:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • Đối với bảng cụ thể:

    Giả sử bạn TABLE_NAME"tin tức" . Sau đó, truy vấn SQL sẽ-

    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;

    Đầu ra:

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

8

Hãy thử lệnh shell sau (thay thế DB_NAMEbằng tên cơ sở dữ liệu của bạn):

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

Đối với giải pháp Drupal / drush, hãy kiểm tra tập lệnh ví dụ sau sẽ hiển thị các bảng lớn nhất đang sử dụng:

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

Đây là một cách khác để làm việc này bằng cách sử dụng dòng lệnh 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

Nếu bạn đang sử dụng phpmyadmin thì chỉ cần đi đến cấu trúc bảng

ví dụ

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

Chuyển thể từ câu trả lời của ChapMic để đáp ứng nhu cầu cụ thể của tôi.

Chỉ chỉ định tên cơ sở dữ liệu của bạn, sau đó sắp xếp tất cả các bảng theo thứ tự giảm dần - từ bảng LARGEST đến SMALLEST bên trong cơ sở dữ liệu đã chọn. Chỉ cần 1 biến để thay thế = tên cơ sở dữ liệu của bạn.

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

Nếu bạn có sshquyền truy cập, bạn cũng có thể muốn thử du -hc /var/lib/mysql(hoặc khác datadir, như được đặt trong my.cnf).


Cuối cùng, một câu trả lời không dựa vào information_schema. Trong trường hợp của tôi, nó đã báo cáo 660 MB trong khi kích thước thực tế trên hệ thống tệp là
1,8 GB

2

Một cách khác để hiển thị số lượng hàng và không gian bị chiếm dụng và đặt hàng bởi nó.

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;  

Chuỗi duy nhất bạn phải thay thế trong truy vấn này là "yourDatabaseName".


2

Tôi thấy các câu trả lời hiện tại không thực sự đưa ra kích thước của các bảng trên đĩa, điều này hữu ích hơn. Truy vấn này cho ước tính đĩa chính xác hơn so với kích thước bảng dựa trên data_length & index. Tôi đã phải sử dụng điều này cho một phiên bản AWS RDS nơi bạn không thể kiểm tra thực tế đĩa và kiểm tra kích thước tệp.

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

Tính tổng kích thước của cơ sở dữ liệu ở cuối:

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

Tất cả 2 ở trên được thử nghiệm trên mysql


1

Điều này nên được kiểm tra trong mysql, không phải 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; 

Trong khi điều này có thể trả lời câu hỏi của tác giả, nó thiếu một số từ giải thích và / hoặc liên kết đến tài liệu. Đoạn mã thô không hữu ích lắm nếu không có một số cụm từ xung quanh chúng. Bạn cũng có thể tìm thấy làm thế nào để viết một câu trả lời tốt rất hữu ích. Vui lòng chỉnh sửa câu trả lời của bạn - Từ đánh giá
Nick

@Nick tại sao vẫn bị cấm?
William

Xin lỗi, tôi không biết câu trả lời cho điều đó - Tôi không phải là người điều hành.
Nick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.