Covered Query trong MongoDB là một công cụ mạnh mẽ cho phép bạn truy vấn và trả về cơ sở dữ liệu mà không cần phải quét toàn bộ các tài liệu. Thay vào đó, nó sử dụng chỉ mục để có thể truy xuất dữ liệu nhanh nhất. Trong bài viết này, Stringee và các bạn sẽ cùng nhau tìm hiểu khái niệm này và cách sử dụng nó để tối ưu hóa truy vấn nhé.

1. Covered Query là gì?

Trong MongoDB, Covered Query (hoặc còn được gọi là Covered Index Query) là một loại truy vấn mà trong đó:

  • Tất cả các trường trong truy vấn là một phần của một chỉ mục (index).
  • Tất cả các trường được trả về trong kết quả truy vấn cũng nằm trong cùng một chỉ mục.

Covered Query cho phép MongoDB truy xuất dữ liệu mà không cần phải đi vào các tài liệu (documents) cơ sở dữ liệu. Thay vào đó, nó chỉ sử dụng thông tin từ các chỉ mục đã lập sẵn để trả về kết quả. Điều này giúp cải thiện hiệu suất truy vấn đáng kể, đặc biệt là khi bạn làm việc với các tập dữ liệu lớn.

2. Lợi ích và nhược điểm của việc sử dụng Covered Query

2.1. Lợi ích của việc sử dụng Covered Query

  • Tăng hiệu suất truy vấn: Việc sử dụng chỉ mục để trả về kết quả thay vì quét toàn bộ tài liệu giúp giảm thời gian truy cập dữ liệu, đặc biệt là đối với các tập dữ liệu lớn.
  • Giảm tải cho hệ thống: Bởi vì không cần phải truy cập và trả về toàn bộ tài liệu, Covered Query giúp giảm tải cho cơ sở dữ liệu và máy chủ MongoDB.
  • Tối ưu hóa hiệu năng ứng dụng: Những truy vấn nhanh hơn có thể cải thiện trải nghiệm của người dùng và giảm thiểu thời gian chờ đợi.
  • Tiết kiệm tài nguyên hệ thống: Việc giảm lượng tài nguyên (CPU, bộ nhớ) được sử dụng để xử lý các truy vấn cơ sở dữ liệu có thể giúp tối ưu hóa hệ thống và giảm chi phí vận hành.

2.2. Nhược điểm của việc sử dụng Covered Query

Tuy nhiên, việc sử dụng Covered Query trong MongoDB không hẳn là chỉ mang lại những lợi ích mà nó còn có một số điểm hạn chế như:

  • Sử dụng nhiều bộ nhớ
  • Không hỗ trợ join
  • Giới hạn lượng dữ liệu trả về
  • Giới hạn truy vấn lồng

>>> Xem thêm bài viết về MongoDB:

Tìm hiểu về cơ sở dữ liệu phi quan hệ MongoDB

Sử dụng map reduce trong MongoDB

Giới thiệu về GridFS trong MongoDB

3. Sử dụng Covered Query trong MongoDB

Chúng ta sẽ cùng nhau tham khảo một document sau trong MongoDB:

{
   "_id": ObjectId("53402597d852426020000002"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

Đây là một collection có lưu trữ các thông tin của người dùng, giờ đây chúng ta sẽ đi vào một bài toán cụ thể đó là tìm kiếm theo giới tính (gender) và user_name của người dùng. Như đã biết ở trên, để sử dụng truy vấn một cách nhanh và hiệu quả hơn, chúng ta cần đánh index trên các trường thường xuyên sử dụng để truy vấn. 

Áp dụng vào bài toán thực tế chúng ta đang cần giải quyết, ta sẽ đi đánh index cho hai trường là gender và user_name để tìm kiếm.

>db.users.ensureIndex({gender:1,user_name:1})

Bây giờ, chỉ mục này sẽ bao phủ truy vấn sau:

>db.users.find({gender:"M"},{user_name:1,_id:0})

Có thể nói, đây được coi là một Covered Query, nó sẽ không đi vào tìm kiếm các document trong cơ sở dữ liệu mà chỉ thu thập các dữ liệu cần thiết từ chỉ mục. Điều này sẽ giúp tiến trình tìm kiếm xảy ra nhanh hơn rất nhiều.

Khi chỉ mục của chúng ta không bao gồm trường _id, chúng ta đã loại trừ nó một cách tường minh từ tập kết quả của truy vấn, bởi vì với MongoDB, theo mặc định thì sẽ trả về trường _id trong mỗi truy vấn. Vì thế, truy vấn sau sẽ không được phủ bên trong chỉ mục đã tạo ở trên:

>db.users.find({gender:"M"},{user_name:1})

Sau cùng, bạn nhớ rằng một chỉ mục không thể bao phủ một truy vấn nếu:

  • Bất kỳ trường đã được lập chỉ mục nào là một mảng
  • Bất kỳ trường đã được lập chỉ mục nào là một Subdocument

Kết bài

Covered Query trong MongoDB là một cách tối ưu hóa hiệu suất truy vấn bằng cách sử dụng chỉ mục. Điều này giúp tăng tốc độ truy vấn và giảm tải lên cơ sở dữ liệu. Tuy nhiên, việc thiết kế chỉ mục cẩn thận và tối ưu hóa truy vấn là quan trọng để đảm bảo tính nhất quán của dữ liệu và hiệu suất hệ thống. Bằng cách tận dụng hiệu quả kỹ thuật này, bạn có thể tối ưu hóa trải nghiệm làm việc với MongoDB của mình.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: