2012-11-15 29 views
16

Trước hết, tôi biết về câu hỏi này:MongoDB có sử dụng lại không gian đã xóa không?

Auto compact the deleted space in mongodb?

Câu hỏi của tôi không phải là về thu hẹp kích thước file DB Mặc dù vậy, nhưng nhiều hơn về việc tái sử dụng không gian xóa. Giả sử tôi có 100 nghìn tài liệu trong bộ sưu tập, sau đó tôi xóa 50 nghìn tài liệu. Mongo sẽ tái sử dụng không gian trong tệp dữ liệu của nó mà các tài liệu đã xóa đã được giải phóng chưa? Hoặc là họ chỉ đơn giản là "đánh dấu" là đã xóa?

Tôi không quan tâm quá nhiều về kích thước thực của tệp trên đĩa, nó còn hơn về "nó chỉ phát triển và phát triển" không.

Trả lời

20

Cập nhật (tháng 3 năm 2015): Kể từ bản phát hành 3.0, có nhiều storage engines có sẵn trong MongoDB. Câu trả lời này áp dụng cho công cụ lưu trữ MMAP (vẫn là mặc định trong MongoDB 3.0), câu trả lời cho các công cụ khác (ví dụ như WiredTiger) khá khác nhau và có thể điều chỉnh được và điều chỉnh được. Do đó nếu bạn đang sử dụng một công cụ khác, vui lòng đọc các tài liệu liên quan cho công cụ lưu trữ đó để xác định không gian và tùy chọn sử dụng lại không gian của bạn là gì.

Với công cụ lưu trữ MMAP, khi tài liệu bị xóa, khoảng trống còn lại được đưa vào danh sách miễn phí. Tuy nhiên, để sử dụng không gian sẽ cần phải có các tài liệu có kích thước tương tự được chèn vào sau, và MongoDB sẽ cần phải tìm một không gian thích hợp cho tài liệu đó trong một khung thời gian nhất định (một khi nó lần lượt nhìn vào danh sách, nó sẽ chỉ chắp thêm) không gian tái sử dụng sẽ không xảy ra thường xuyên. Việc xóa này được thực hiện trong các tệp dữ liệu, do đó không có cải tiến không gian đĩa xảy ra ở đây - tất cả điều này được thực hiện bên trong các tệp dữ liệu hiện có.

Nếu sau đó bạn thực hiện repair hoặc resync a secondary từ đầu, các tệp dữ liệu được viết lại và không gian trên đĩa sẽ được khôi phục (mọi phần đệm trên tài liệu cũng bị xóa). Đây là nơi bạn sẽ thấy sự khai hoang không gian thực trên đĩa. Đối với bất kỳ hành động nào khác (bao gồm cả compact), việc sử dụng đĩa sẽ không thay đổi và thậm chí có thể tăng lên.

Với 2,2+ giờ bạn có thể sử dụng tùy chọn collMod commandusePowersOf2Sizes để làm cho việc sử dụng lại không gian đã xóa nhiều khả năng hơn (lưu ý rằng đây là default in 2.6 +). Điều này có nghĩa là phân bổ không gian ban đầu cho một tài liệu ít hiệu quả hơn một chút (512 byte cho một tài liệu 400 byte) nhưng có nghĩa là khi một tài liệu mới được chèn vào, nó có nhiều khả năng tái sử dụng không gian đó. Nếu bạn đang xóa (hoặc đang phát triển và do đó di chuyển) tài liệu rất nhiều, sau đó điều này sẽ có hiệu quả hơn trong dài hạn.

Đối với bất cứ ai quan tâm đến, một trong những người đó đã viết rất nhiều mã lưu trữ (Mathias Stearn) có một bài thuyết trình tuyệt vời về internals lưu trữ, có thể found here

Các vấn đề liên quan