Tài liệu về nhà → Hướng dẫn sử dụng MongoDB → MongoDB Manual
MongoDB hỗ trợ các chỉ mục hợp chất, trong đó một cấu trúc chỉ mục duy nhất giữ các tham chiếu đến nhiều trường [1] trong các tài liệu của bộ sưu tập. Biểu đồ sau đây minh họa một ví dụ về chỉ số hợp chất trên hai trường:
Các chỉ mục hợp chất có thể hỗ trợ các truy vấn phù hợp trên nhiều trường.
Để tạo một chỉ số hợp chất, hãy sử dụng thao tác giống với nguyên mẫu sau:compound index use an operation that resembles the following prototype:
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
Giá trị của trường trong đặc tả chỉ số mô tả loại chỉ mục cho trường đó. Ví dụ: giá trị của 1 chỉ định một chỉ mục đặt hàng các mục theo thứ tự tăng dần. Giá trị của
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
Thứ tự của các trường được lập chỉ mục có tác động mạnh mẽ đến hiệu quả của một chỉ mục cụ thể cho một truy vấn nhất định. Đối với hầu hết các chỉ mục hợp chất, theo quy tắc ESR (bình đẳng, sắp xếp, phạm vi) giúp tạo ra các chỉ mục hiệu quả.
Quan trọng
Hãy xem xét một bộ sưu tập có tên
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
Hoạt động sau đây tạo ra một chỉ mục tăng dần trên các trường
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
db.products.createIndex( { "item": 1, "stock": 1 } )
Thứ tự của các trường được liệt kê trong một chỉ số ghép là rất quan trọng. Chỉ số sẽ chứa các tham chiếu đến các tài liệu được sắp xếp đầu tiên theo các giá trị của trường
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
Ngoài việc hỗ trợ các truy vấn khớp trên tất cả các trường chỉ mục, các chỉ mục ghép có thể hỗ trợ các truy vấn khớp với tiền tố của các trường chỉ mục. Nghĩa là, chỉ mục hỗ trợ các truy vấn trên trường
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
db.products.find( { item: "Banana" } ) |
db.products.find( { item: "Banana", stock: { $gt: 5 } } ) |
Để biết chi tiết, xem tiền tố.Prefixes.
Chỉ mục lưu trữ tham chiếu đến các trường trong đơn đặt hàng tăng dần (1) hoặc giảm dần (____10). Đối với các chỉ mục trường đơn, thứ tự sắp xếp các khóa không quan trọng vì MongoDB có thể đi qua chỉ số theo một trong hai hướng. Tuy nhiên, đối với các chỉ mục hợp chất, thứ tự sắp xếp có thể quan trọng trong việc xác định liệu chỉ mục có thể hỗ trợ hoạt động sắp xếp hay không.compound indexes, sort order can matter in determining whether the index can support a sort operation.
Hãy xem xét một bộ sưu tập
db.products.createIndex( { "item": 1, "stock": 1 } )
1 chứa các tài liệu với các trườngdb.products.createIndex( { "item": 1, "stock": 1 } )
2 vàdb.products.createIndex( { "item": 1, "stock": 1 } )
3. Các ứng dụng có thể phát hành các truy vấn trả về kết quả được sắp xếp đầu tiên bằng cách tăng giá trịdb.products.createIndex( { "item": 1, "stock": 1 } )
2 và sau đó giảm giá (nghĩa là gần đây hơn đến cuối cùng)db.products.createIndex( { "item": 1, "stock": 1 } )
3, chẳng hạn như:db.events.find().sort( { username: 1, date: -1 } )
hoặc các truy vấn trả về kết quả được sắp xếp đầu tiên bằng cách giảm giá trị
db.products.createIndex( { "item": 1, "stock": 1 } )
2 và sau đó bằng cách tăng giá trịdb.products.createIndex( { "item": 1, "stock": 1 } )
3, chẳng hạn như:db.events.find().sort( { username: -1, date: 1 } )
Chỉ mục sau đây có thể hỗ trợ cả hai hoạt động sắp xếp sau:
db.events.createIndex( { "username" : 1, "date" : -1 } )
Tuy nhiên, chỉ số trên không thể hỗ trợ sắp xếp bằng cách tăng giá trị
db.products.createIndex( { "item": 1, "stock": 1 } )
2 và sau đó bằng cách tăng giá trịdb.products.createIndex( { "item": 1, "stock": 1 } )
3, chẳng hạn như sau:cannot support sorting by ascendingdb.products.createIndex( { "item": 1, "stock": 1 } )
2 values and then by ascendingdb.products.createIndex( { "item": 1, "stock": 1 } )
3 values, such as the following:db.events.find().sort( { username: 1, date: 1 } )
Để biết thêm thông tin về thứ tự sắp xếp và chỉ mục hợp chất, hãy xem các chỉ mục sử dụng để sắp xếp kết quả truy vấn.
Tiền tố chỉ mục là các tập hợp con bắt đầu của các trường được lập chỉ mục. Ví dụ, hãy xem xét chỉ số hợp chất sau:
{ "item": 1, "location": 1, "stock": 1 }
Chỉ mục có các tiền tố chỉ mục sau:
0db.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } )
1db.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } )
Đối với một chỉ số ghép, MongoDB có thể sử dụng chỉ mục để hỗ trợ các truy vấn trên các tiền tố chỉ mục. Do đó, MongoDB có thể sử dụng chỉ mục cho các truy vấn trên các trường sau:
Trường
2,{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" } Trường
2 và trường{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }
4,db.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } ) Trường
2 và trường{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }
4 và trườngdb.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } )
3.{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }
MongoDB cũng có thể sử dụng chỉ mục để hỗ trợ truy vấn trên các trường
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
Vì một truy vấn trên
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
db.products.find( { item: "Banana" } ) |
db.products.find( { item: "Banana", stock: { $gt: 5 } } ) |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
db.products.find( { item: "Banana" } ) |
db.products.find( { item: "Banana", stock: { $gt: 5 } } ) |
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
MongoDB không thể sử dụng chỉ mục để hỗ trợ các truy vấn bao gồm các trường sau vì không có trường
{ |
"_id": ObjectId(...), |
"item": "Banana", |
"category": ["food", "produce", "grocery"], |
"location": "4th Street Store", |
"stock": 4, |
"type": "cases" |
} |
Trường
4,db.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } ) Trường
3, hoặc{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" } Các trường
4 vàdb.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } )
3.{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }
Nếu bạn có một bộ sưu tập có cả chỉ mục ghép và chỉ mục trên tiền tố của nó (ví dụ:
db.events.find().sort( { username: -1, date: 1 } )
4 vàdb.events.find().sort( { username: -1, date: 1 } )
5), nếu không chỉ mục nào có ràng buộc thưa thớt hoặc duy nhất, thì bạn có thể xóa chỉ mục trên tiền tố (ví dụ:db.events.find().sort( { username: -1, date: 1 } )
5). MongoDB sẽ sử dụng chỉ số hợp chất trong tất cả các tình huống mà nó sẽ sử dụng chỉ số tiền tố.Bắt đầu từ phiên bản 2.6, MongoDB có thể sử dụng giao lộ chỉ mục để thực hiện các truy vấn. Sự lựa chọn giữa việc tạo các chỉ mục hợp chất hỗ trợ các truy vấn của bạn hoặc dựa vào giao điểm chỉ mục phụ thuộc vào các chi tiết cụ thể của hệ thống của bạn. Xem Index Intersection và các chỉ số hợp chất để biết thêm chi tiết.
Các ứng dụng có thể gặp phải hiệu suất giảm trong quá trình xây dựng chỉ mục, bao gồm truy cập đọc/ghi hạn chế vào bộ sưu tập. Để biết thêm thông tin về quy trình xây dựng chỉ mục, hãy xem các bản dựng chỉ mục trên các bộ sưu tập đông dân cư, bao gồm các bản dựng chỉ mục trong phần môi trường được sao chép.
Một số trình điều khiển có thể chỉ định các chỉ mục, sử dụng
db.events.find().sort( { username: -1, date: 1 } )
7 thay vì 1 làm đặc điểm kỹ thuật. Điều này không có bất kỳ ảnh hưởng đến chỉ số kết quả.