Sparse index chỉ bỏ qua document không có field được index. Partial index chỉ index document thỏa một điều kiện filter bất kỳ — nó là bản tổng quát hơn và là lựa chọn mặc định nên dùng.
// sparse: chỉ index user có field phone
db.users.createIndex({ phone: 1 }, { sparse: true })
// partial: chỉ index đơn chưa hoàn tất — thứ mà dashboard truy vấn liên tục
db.orders.createIndex(
{ createdAt: -1 },
{ partialFilterExpression: { status: { $in: ['pending', 'processing'] } } }
)Lợi ích của partial: nếu 95% đơn đã completed thì index chỉ còn 5% kích thước, ghi cũng nhẹ hơn vì đơn completed không phải cập nhật index.
Ba điểm hay bị hỏi thêm:
- Query phải khớp được điều kiện trong partialFilterExpression thì optimizer mới dùng index đó. Query không lọc status sẽ không dùng được.
- Unique + partial là cách làm "unique có điều kiện": ví dụ email phải duy nhất nhưng chỉ trong nhóm tài khoản chưa xóa mềm (deletedAt: { $exists: false }).
- Sparse index kết hợp unique cho phép nhiều document thiếu field cùng tồn tại, trong khi unique index thường coi mọi document thiếu field là cùng giá trị null và chỉ cho phép một cái.