Hãy để tôi cung cấp cho bạn một vài gợi ý dựa trên kiến thức và kinh nghiệm toàn cầu của tôi:
Sử dụng tên trường ngắn hơn
MongoDB lưu trữ cùng một khóa cho mỗi tài liệu. Sự lặp lại này làm tăng dung lượng ổ đĩa. Điều này có thể gây ra một số vấn đề về hiệu suất trên một cơ sở dữ liệu rất lớn như của bạn.
Ưu điểm:
- Kích thước tài liệu nhỏ hơn, vì vậy ít dung lượng đĩa hơn
- Nhiều tài liệu hơn để phù hợp với RAM (nhiều bộ nhớ đệm hơn)
- Kích thước của các chỉ mục do sẽ nhỏ hơn trong một số trường hợp
Nhược điểm:
- Tên khó đọc hơn
Tối ưu hóa kích thước chỉ mục
Kích thước chỉ mục càng nhỏ, nó càng phù hợp với RAM và ít xảy ra tình trạng bỏ lỡ chỉ mục hơn. Hãy xem xét một hàm băm SHA1 cho các cam kết git chẳng hạn. Một cam kết git được biểu diễn nhiều lần bằng 5-6 ký tự đầu tiên. Sau đó, chỉ cần lưu trữ 5-6 ký tự thay vì tất cả các hàm băm.
Hiểu hệ số đệm
Đối với các cập nhật xảy ra trong tài liệu gây ra việc di chuyển tài liệu tốn kém. Tài liệu này di chuyển gây ra việc xóa tài liệu cũ và cập nhật nó vào một vị trí trống mới và cập nhật chỉ mục gây tốn kém.
Chúng tôi cần đảm bảo rằng tài liệu không di chuyển nếu một số cập nhật xảy ra. Đối với mỗi bộ sưu tập, có một yếu tố đệm liên quan, nó cho biết, trong quá trình chèn tài liệu, cần phân bổ thêm bao nhiêu không gian ngoài kích thước tài liệu thực tế.
Bạn có thể xem hệ số đệm bộ sưu tập bằng cách sử dụng:
db.collection.stats().paddingFactor
Thêm đệm theo cách thủ công
Trong trường hợp của bạn, bạn khá chắc chắn nên bắt đầu với một tài liệu nhỏ sẽ phát triển. Cập nhật tài liệu của bạn sau một thời gian sẽ gây ra nhiều lần di chuyển tài liệu. Vì vậy, tốt hơn hãy thêm một phần đệm cho tài liệu. Thật không may, không có cách nào dễ dàng để thêm phần đệm. Chúng tôi có thể làm điều đó bằng cách thêm một số byte ngẫu nhiên vào một số khóa trong khi thực hiện chèn và sau đó xóa khóa đó trong truy vấn cập nhật tiếp theo.
Cuối cùng, nếu bạn chắc chắn rằng một số khóa sẽ đến với tài liệu trong tương lai, thì hãy phân bổ trước các khóa đó với một số giá trị mặc định để các bản cập nhật tiếp theo không làm tăng kích thước tài liệu gây ra di chuyển tài liệu.
Bạn có thể biết chi tiết về truy vấn khiến tài liệu di chuyển:
db.system.profile.find({ moved: { $exists : true } })
Số lượng lớn bộ sưu tập VS số lượng lớn tài liệu trong số ít bộ sưu tập
Lược đồ là một cái gì đó phụ thuộc vào các yêu cầu ứng dụng. Nếu có một bộ sưu tập khổng lồ trong đó chúng tôi chỉ truy vấn dữ liệu N ngày gần nhất, thì chúng tôi có thể tùy ý chọn bộ sưu tập riêng biệt và dữ liệu cũ có thể được lưu trữ an toàn. Điều này sẽ đảm bảo rằng bộ nhớ đệm trong RAM được thực hiện đúng cách.
Mỗi bộ sưu tập được tạo ra đều phải chịu một khoản chi phí cao hơn chi phí tạo bộ sưu tập. Mỗi bộ sưu tập có kích thước tối thiểu là một vài KB + một chỉ mục (8 KB). Mỗi bộ sưu tập đều có một không gian tên được liên kết, theo mặc định, chúng tôi có một số không gian tên 24K. Ví dụ:có một bộ sưu tập cho mỗi Người dùng là một lựa chọn tồi vì nó không thể mở rộng. Sau một thời gian, Mongo sẽ không cho phép chúng tôi tạo bộ sưu tập chỉ mục mới.
Nói chung có nhiều bộ sưu tập không có hình phạt hiệu suất đáng kể. Ví dụ:chúng tôi có thể chọn có một bộ sưu tập mỗi tháng, nếu chúng tôi biết rằng chúng tôi luôn truy vấn dựa trên các tháng.
Chuẩn hóa dữ liệu
Nó luôn được khuyến nghị giữ tất cả dữ liệu liên quan cho một truy vấn hoặc chuỗi các truy vấn trong cùng một vị trí đĩa. Bạn cần sao chép thông tin trên các tài liệu khác nhau. Ví dụ:trong một bài đăng trên blog, bạn sẽ muốn lưu trữ các nhận xét của bài đăng trong tài liệu bài đăng.
Ưu điểm:
- kích thước chỉ mục sẽ rất ít vì số lượng mục nhập chỉ mục sẽ ít hơn Truy vấn
- sẽ rất nhanh, bao gồm cả việc tìm nạp tất cả các chi tiết cần thiết
- kích thước tài liệu sẽ tương đương với kích thước trang, có nghĩa là khi chúng tôi đưa dữ liệu này vào RAM, hầu hết thời gian chúng tôi không đưa dữ liệu khác dọc theo trang
- việc di chuyển tài liệu sẽ đảm bảo rằng chúng tôi đang giải phóng một trang chứ không phải một phần nhỏ nhỏ trong trang có thể không được sử dụng trong các lần chèn thêm
Bộ sưu tập có giới hạn
Bộ sưu tập có giới hạn hoạt động giống như bộ đệm tròn. Chúng là loại đặc biệt của các bộ sưu tập kích thước cố định. Bộ sưu tập này có thể nhận được các lần ghi và đọc tuần tự với tốc độ rất cao. Có kích thước cố định, khi không gian được cấp phát được lấp đầy, các tài liệu mới sẽ được viết bằng cách xóa các tài liệu cũ hơn. Tuy nhiên, chỉ cho phép cập nhật tài liệu nếu tài liệu được cập nhật phù hợp với kích thước tài liệu gốc (sử dụng padding để linh hoạt hơn).