Như danh bạ sắp theo "họ rồi tên", thứ tự field trong compound index quyết định query nào dùng được nó. Quy tắc thực dụng là ESR (Equality → Sort → Range):
- Equality trước: field lọc bằng (vd tenantId).
- Sort tiếp theo: field dùng để sắp xếp.
- Range sau cùng: field lọc khoảng như >, <, $in (vd createdAt).
Ví dụ: index { tenantId: 1, status: 1, createdAt: -1 } tốt cho query lọc bằng tenantId/status rồi sort theo createdAt.
db.orders.createIndex({ tenantId: 1, status: 1, createdAt: -1 })Lưu ý: không có thứ tự nào đúng cho mọi query.
Nếu các query khác nhau nhiều, cân nhắc tạo index riêng hoặc đổi access pattern.
Like a phone book sorted by "last name then first name", field order in a compound index decides which queries can use it. The practical rule is ESR (Equality → Sort → Range):
- Equality first: exact-match filter fields (e.g. tenantId).
- Sort next: fields used for sorting.
- Range last: range-filter fields like >, <, $in (e.g. createdAt).
Example: the index { tenantId: 1, status: 1, createdAt: -1 } works well for queries filtering tenantId/status by equality then sorting by createdAt.
db.orders.createIndex({ tenantId: 1, status: 1, createdAt: -1 })Note: no single order is right for every query.
If query shapes differ a lot, consider separate indexes or changing access patterns.