Sự khác biệt đáng kể giữa kích thước cơ sở dữ liệu trong MySQL và kích thước thực tế trên đĩa


8

Khi tôi kiểm tra kích thước của cơ sở dữ liệu của mình trong MySQL, tôi nhận được điều này:

MariaDB [(none)]> SELECT table_schema "Data Base Name",  sum( data_length + index_length ) / 1024 /  1024 "Data Base Size in MB",  sum( data_free )/ 1024 / 1024 "Free Space in MB"  FROM information_schema.TABLES  GROUP BY table_schema;
+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| alfresco           |         245.75000000 |      34.00000000 |
| drupal             |         892.15625000 |     216.00000000 |
+--------------------+----------------------+------------------+

Khi tôi kiểm tra kích thước trên đĩa, tôi nhận được điều này:

$ sudo du -h --max-depth=1 /var/lib/mysql/
317M    /var/lib/mysql/alfresco
1.4G    /var/lib/mysql/drupal

Nếu tôi kết hợp cả không gian đã sử dụng và không gian trống do Maria DB cung cấp và so sánh nó với các số liệu trên đĩa, tôi có những điều sau đây:

alfresco: DB=279MB  DISK=317MB (+14%)
drupal: DB=1100MB   DISK=1433MB (+30%)

Q: Có bình thường khi có quá nhiều chi phí trên đĩa / Tôi có thể làm gì để giảm bớt không?

FYI Tôi nghĩ rằng việc chạy tối ưu hóa mysql sẽ giúp ích ( sử dụng lệnh đó ), nó đã làm giảm kích thước của cơ sở dữ liệu, nhưng không thay đổi kích thước của các tệp trên đĩa.

Thông tin bổ sung:

server:             ubuntu server 10.04 LTS
DB server:          MariaDB
DB engine:          InnoDB v10 (for all tables)
Table collation:    utf8_general_ci
Nb Drupal tables:   416  (0.80MB overhead per table)
Nb Alfresco tables: 84   (0.45MB overhead per table)

Tất cả các bảng InnoDB? Có bao nhiêu bàn?
gbn

Câu trả lời:


5

Nếu bạn đang sử dụng bảng InnoDB, kích thước tệp ibdata của bạn sẽ tăng theo thời gian. Vì vậy, nếu bạn đưa ra DELETEcâu lệnh, kích thước cơ sở dữ liệu của bạn sẽ giảm, nhưng tệp ibdata sẽ giữ nguyên (không giảm).

Nếu bạn không sử dụng innodb_file_per_tabletùy chọn, cách duy nhất để lấy lại không gian là bằng cách loại bỏ cơ sở dữ liệu và khôi phục từ dumpfile.

Tuy nhiên, nếu bạn đang sử dụng innodb_file_per_table, bạn có thể đưa ra một

ALTER TABLE foo ENGINE=InnoDB;

trên các bảng phát triển quá lớn để lấy lại không gian đĩa.


Tại sao kích thước của các tệp ibdata không giảm nếu kích thước của cơ sở dữ liệu?
Tối đa

Đây rõ ràng là một "quyết định thiết kế" được đưa ra bởi các nhà phát triển của innodb, được giải thích ngắn gọn trong các bình luận về lỗi này . Một yêu cầu tính năng tương tự đã được thực hiện trong một vài năm trở lại đây, nhưng không có gì được thực hiện về nó. Tôi không đồng ý với quyết định thiết kế cá nhân, nhưng đó là những gì nó được.
Derek Downey

Tại sao không tối ưu hóa không gian lấy lại bảng? hay đó chỉ là "gọn gàng" chứ không "thu nhỏ"?
gbn

1
@gbn "Đối với các bảng InnoDB, OPTIMIZE TABLE được ánh xạ thành ALTER TABLE, nó sẽ xây dựng lại bảng để cập nhật số liệu thống kê chỉ mục và không gian không sử dụng miễn phí trong chỉ mục được nhóm." src Vì vậy, có, chỉ là một gọn gàng. Cùng một lý do AlTER TABLE foo ENGINE=InnoDBinnodb_file_per_table=1không thu nhỏ ibdata.
Derek Downey
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.