Mongodb query từ 5.95 seconds xuống 0.3 seconds

Nội dung bài viết

Như một thói quen hằng ngày, tôi thường dạo qua những cộng đồng mà mỗi lập trình viên nên đọc mỗi sáng, và tôi đã gặp một trường hợp rất hay. Và cũng do thói quen đó mà tôi cũng hay có những mẹo viết code hay đáo để. Hôm nay viết lại cho anh em vấn đề đó và cách giải quyết không thể bất ngờ hơn.

Slow MongoDB Query

Đó là một câu hỏi trên cộng đồng Reddit, về việc truy vấn trong Mongodb rất chậm so với quy định. Trong Collection của anh ta chỉ có 1167 documents tương đương với 2,76Mb nhưng khi truy vấn anh ta mất 5.95 seconds trong đó có sử dụng lookup. Ngoài ra, anh ta còn ghi chú là mạng của anh ta rất chi là ok. Cụ thể mạng anh ta lên tới 500 mb/s up.

Nếu xem qua những con số trên thì quá chậm so với tỷ lệ của Documents. Sau đó, anh ta đã tìm ra giải pháp đơn giản mà không ai ngờ tới. Vậy giải pháo đó là gì?

Sử dụng lean() sau find() với Mongoose

Đó là một vấn đề đến từ việc sử dụng Mongoose đã làm cho chậm hệ thống. Nhưng dướng như Mongoose đã phát hiện được điều đó mà đã fix điều này, như vậy anh ta đã được giải quyết.

Use Lean()

Theo mặc định, các truy vấn Mongoose trả về một thể hiện của Mongoose Document Class . Documents được trả về nặng hơn nhiều so với các đối tượng của JavaScript vanilla, vì chúng có nhiều trạng thái bên trong để theo dõi thay đổi. Việc kích hoạt lean() này sẽ cho Mongoose bỏ qua việc khởi tạo toàn bộ tài liệu Mongoose và chỉ cung cấp cho bạn POJO.

Và đây là kiểm chứng, chỗ này vui lòng đọc chầm chậm, khi sử dụng lean() nhỏ hơn bao nhiêu? Đây là một so sánh.

const schema = new mongoose.Schema({ name: String });
const MyModel = mongoose.model('Test', schema);

await MyModel.create({ name: 'test' });

// Module tính kích thước
const sizeof = require('object-sizeof');

const normalDoc = await MyModel.findOne();
// To enable the `lean` option for a query, use the `lean()` function.
const leanDoc = await MyModel.findOne().lean();

sizeof(normalDoc); // >= 1000
sizeof(leanDoc); // 86, 10x smaller!

JSON.stringify(normalDoc).length === JSON.stringify(leanDoc.length); // true

Lời kết

Như vậy đã quá rõ, việc không sử dụng lean() và việc sử dụng learn() nó khác xa nhau. Điều đó đã được tài liệu đem ra so sánh kết quả nhẹ hơn từ đó truy vấn nhanh hơn rất nhiều khi sử dụng find().

Câu hỏi trên reddit: Slow Mongodb Query

Có thể bạn đã bị missing