CÂU TRẢ LỜI 2019
Câu trả lời này dành cho MongoDB 4.2
Sau khi đọc câu hỏi và cuộc thảo luận giữa các bạn, tôi tin rằng vấn đề đã được giải quyết nhưng việc tối ưu hóa vẫn là vấn đề chung của tất cả những ai đang sử dụng MongoDB.
Tôi cũng gặp phải vấn đề tương tự và đây là các mẹo để tối ưu hóa truy vấn.
Hãy sửa cho tôi nếu tôi sai :)
1. Thêm chỉ mục vào bộ sưu tập
Chỉ mục đóng một vai trò quan trọng trong việc chạy các truy vấn nhanh chóng vì Chỉ mục là cấu trúc dữ liệu có thể lưu trữ tập dữ liệu của bộ sưu tập ở dạng dễ xem. Các truy vấn được thực thi hiệu quả với sự trợ giúp của các chỉ mục trong MongoDB.
Bạn có thể tạo một loại chỉ mục khác nhau tùy theo nhu cầu của bạn. Tìm hiểu thêm về các chỉ mục tại đây, tài liệu MongoDB chính thức.
2. Tối ưu hóa đường ống
- Luôn sử dụng $ match trước $ project , vì các bộ lọc sẽ xóa các trường và tài liệu thừa khỏi giai đoạn tiếp theo.
- Luôn nhớ rằng chỉ mục được sử dụng bởi $ match và $ sort . Vì vậy, hãy thử thêm chỉ mục vào các trường mà bạn sắp xếp hoặc lọc tài liệu.
- Cố gắng giữ chuỗi này trong truy vấn của bạn, sử dụng $ sort trước $ giới hạn như $ sort + $ limit + $ bỏ qua. Vì $ sort tận dụng lợi thế của chỉ mục và cho phép MongoDB chọn kế hoạch truy vấn bắt buộc trong khi thực hiện truy vấn.
- Luôn sử dụng $ giới hạn trước khi $ bỏ qua vì vậy việc bỏ qua sẽ được áp dụng để giới hạn Tài liệu.
- Sử dụng $ project để chỉ trả lại dữ liệu cần thiết trong giai đoạn tiếp theo.
-
Luôn tạo chỉ mục trên các thuộc tính Trường ngoại trong $ lookup . Ngoài ra, khi tra cứu tạo ra một mảng, chúng tôi thường giải nén nó trong giai đoạn tiếp theo. Vì vậy, thay vì mở cuộn nó trong giai đoạn tiếp theo, hãy mở nó ra bên trong tra cứu như:
{ $lookup: { from: "Collection", as: "resultingArrays", localField: "x", foreignField: "y", unwinding: { preserveNullAndEmptyArrays: false }
}}
-
Sử dụng allowDiskUse trong tập hợp, với sự trợ giúp của nó, các phép toán tổng hợp có thể ghi dữ liệu vào thư mục con _tmp trong thư mục Đường dẫn cơ sở dữ liệu. Nó được sử dụng để thực hiện truy vấn lớn trên thư mục tạm thời. Ví dụ:
db.orders.aggregate( [ { $match: { status: "A" } }, { $group: { _id: "$uid", total: { $sum: 1 } } }, { $sort: { total: -1 } } ], { allowDiskUse: true }, )
3. Tạo lại các chỉ mục
Nếu bạn thường xuyên tạo và xóa các chỉ mục thì hãy xây dựng lại các chỉ mục của mình. Nó giúp MongoDB làm mới, kế hoạch truy vấn đã được lưu trữ trước đó trong bộ nhớ cache, tiếp tục tiếp nhận kế hoạch truy vấn bắt buộc, tin tôi đi, vấn đề đó thật tệ :(
4. Xóa các chỉ mục không mong muốn
Quá nhiều chỉ mục mất quá nhiều thời gian trong thao tác Tạo, Cập nhật và Xóa vì chúng cần tạo chỉ mục cùng với các tác vụ của mình. Vì vậy, loại bỏ chúng sẽ giúp ích rất nhiều.
5. Tài liệu giới hạn
Trong trường hợp thực tế, việc tìm nạp dữ liệu hoàn chỉnh có trong cơ sở dữ liệu không giúp ích được gì. Ngoài ra, bạn không thể hiển thị nó hoặc người dùng không thể đọc dữ liệu đã tải đầy đủ. Vì vậy, thay vì tìm nạp dữ liệu hoàn chỉnh, hãy tìm nạp dữ liệu theo từng phần để giúp cả bạn và khách hàng của bạn xem dữ liệu đó.
Và cuối cùng, việc xem kế hoạch thực thi nào được MongoDB lựa chọn sẽ giúp tìm ra vấn đề chính. Vì vậy, $ giải thích sẽ giúp bạn tìm ra điều đó.
Hy vọng phần tóm tắt này sẽ giúp ích cho các bạn, vui lòng đề xuất những điểm mới nếu tôi bỏ sót. Tôi cũng sẽ thêm chúng.