Mongodb có lập chỉ mục tất cả các trường không?

Bạn có thể thắc mắc điều này vì tài liệu chỉ có bốn trường và bây giờ chỉ mục của bạn cũng có bốn trường. Nhưng với lược đồ linh hoạt, cơ sở dữ liệu không biết rằng các trường trong chỉ mục là các trường duy nhất có trong tài liệu. Vì vậy, mặc dù hiện tại điều đó có thể đúng khi ứng dụng của bạn phát triển và bạn có thể bắt đầu thêm các trường khác vào tài liệu, nhưng chỉ mục sẽ vẫn chỉ có bốn trường này

Giờ đây, việc thêm

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
6 vào chỉ mục giúp truy vấn của bạn nhanh hơn nhưng nó đã nhanh hơn so với quét bộ sưu tập vì chỉ mục có thể cho phép bạn tìm một tập hợp con nhỏ các tài liệu đáp ứng tiêu chí của bạn nhanh hơn. Vì vậy, thêm
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
6 vì bạn cần trả lại nó là được. Ngoài ra, các chỉ mục không lưu trữ tên trường trong chúng và chúng sử dụng nén tiền tố để chỉ mục của bạn có thể nhỏ hơn nhiều so với bộ sưu tập của bạn ngay cả khi có vẻ như thông tin trong chỉ mục giống với thông tin trong bộ sưu tập

Các chỉ mục tốt nhất cho ứng dụng của bạn phải tính đến một số yếu tố, bao gồm các loại truy vấn bạn mong đợi, tỷ lệ số lần đọc ghi và dung lượng bộ nhớ trống trên hệ thống của bạn

Khi phát triển chiến lược lập chỉ mục của mình, bạn nên hiểu sâu về các truy vấn của ứng dụng của mình. Trước khi bạn xây dựng các chỉ mục, hãy vạch ra các loại truy vấn mà bạn sẽ chạy để bạn có thể xây dựng các chỉ mục tham chiếu đến các trường đó. Các chỉ mục đi kèm với chi phí hiệu suất, nhưng đáng giá hơn chi phí cho các truy vấn thường xuyên trên các tập dữ liệu lớn. Xem xét tần suất tương đối của mỗi truy vấn trong ứng dụng và liệu truy vấn đó có biện minh cho một chỉ mục hay không

Chiến lược tổng thể tốt nhất để thiết kế chỉ mục là lập hồ sơ nhiều cấu hình chỉ mục với tập dữ liệu tương tự như cấu hình bạn sẽ chạy trong sản xuất để xem cấu hình nào hoạt động tốt nhất. Kiểm tra các chỉ mục hiện tại được tạo cho các bộ sưu tập của bạn để đảm bảo chúng đang hỗ trợ các truy vấn hiện tại và theo kế hoạch của bạn. Nếu một chỉ mục không còn được sử dụng, bỏ chỉ mục

Nói chung, MongoDB chỉ sử dụng một chỉ mục để thực hiện hầu hết các truy vấn. Tuy nhiên, mỗi mệnh đề của truy vấn

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
8 có thể sử dụng một chỉ mục khác và ngoài ra, MongoDB có thể sử dụng giao điểm của nhiều chỉ mục

Chỉ mục là một cách để tổ chức thông tin sao cho công cụ cơ sở dữ liệu có thể nhanh chóng tìm thấy các kết quả có liên quan. Hãy nghĩ về một tủ tài liệu trong một văn phòng y tế. Tất cả các tệp thường được lưu trữ theo một thứ tự cụ thể, chẳng hạn như họ của bệnh nhân. Nếu bạn cần tìm hồ sơ bệnh nhân có họ bắt đầu bằng chữ “L”, bạn sẽ biết chính xác cần tìm ở ngăn kéo nào

Các chỉ mục hoạt động theo cùng một cách; . Lưu ý rằng chỉ mục không thay đổi thứ tự của dữ liệu. Thay vào đó, nó tạo ra một danh sách có thứ tự, sau đó ánh xạ tới các mục riêng lẻ

Cũng trong văn phòng y tế đó, nếu bạn đang tìm kiếm tất cả bệnh nhân của mình với một đơn thuốc cụ thể, bạn sẽ cần mở từng tệp và xem nội dung. Phương pháp tìm kiếm này có thể mất nhiều thời gian

Điều tương tự cũng xảy ra với cơ sở dữ liệu. Không có chỉ mục, công cụ cơ sở dữ liệu cần đi qua từng bản ghi để xem có khớp không. Rất may, với cơ sở dữ liệu, bạn có thể thêm nhiều chỉ mục. Trong trường hợp này, bạn có thể thêm chỉ mục thứ hai vào đơn thuốc và cơ sở dữ liệu sẽ nhanh hơn nhiều trong việc tìm các bản ghi phù hợp

MongoDB hỗ trợ các chỉ mục phức hợp, trong đó một cấu trúc chỉ mục duy nhất chứa các tham chiếu đến nhiều trường [1] trong tài liệu của bộ sưu tập. Sơ đồ sau đây minh họa một ví dụ về chỉ số phức hợp trên hai trường

Mongodb có lập chỉ mục tất cả các trường không?

[1]MongoDB áp đặt giới hạn 32 trường cho bất kỳ chỉ mục phức hợp nào

Chỉ mục tổng hợp 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

Để tạo ra một

chỉ số hợp chất sử dụng thao tác giống với nguyên mẫu sau.

db.collection.createIndex( { : , : , .. } )

Giá trị của trường trong đặc tả chỉ mục mô tả loại chỉ mục cho trường đó. Ví dụ, một giá trị của

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
9 chỉ định một chỉ mục sắp xếp 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"}
0 chỉ định một chỉ mục sắp xếp các mục theo thứ tự giảm dần. Đối với các loại chỉ mục bổ sung, hãy xem các loại chỉ mục

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ể đối với một truy vấn nhất định. Đối với hầu hết các chỉ mục tổng hợp, việc tuân theo quy tắc ESR (Bình đẳng, Sắp xếp, Phạm vi) giúp tạo chỉ mục hiệu quả

Quan trọng

Bắt đầu từ MongoDB 4. 4

  • Các chỉ mục tổng hợp có thể chứa một trường chỉ mục được băm đơn

  • Bạn sẽ gặp lỗi nếu cố gắng tạo một chỉ mục phức hợp chứa nhiều hơn một trường chỉ mục được băm

Trong MongoDB 4. 2 hoặc sớm hơn

  • Chỉ mục tổng hợp có thể không chứa trường chỉ mục được băm

  • Bạn sẽ gặp lỗi nếu cố gắng tạo một chỉ mục phức hợp chứa trường chỉ mục được băm

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"}
1 chứa các tài liệu giống với tài liệu sau

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}

Thao tác sau đây tạo 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"}
2 và
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
3

db.products.createIndex( { "item": 1, "stock": 1 } )

Thứ tự của các trường được liệt kê trong chỉ mục phức hợp rất quan trọng. Chỉ mục sẽ chứa các tham chiếu đến tài liệu được sắp xếp trước tiên theo giá trị của trường

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2 và, trong mỗi giá trị của trường
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2, được sắp xếp theo giá trị của trường chứng khoán. Xem Thứ tự sắp xếp để biết thêm thông tin.

Ngoài việc hỗ trợ các truy vấn khớp với tất cả các trường chỉ mục, các chỉ mục phức hợ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ợ truy vấn trên trường

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2 cũng như cả trường
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2 và
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
3

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2

Để biết chi tiết, hãy xem Tiền tố.

Thứ tự sắp xếp

Chỉ mục lưu trữ các tham chiếu đến các trường theo thứ tự sắp xếp tăng dần (

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
9) 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ủa các khóa không thành vấn đề vì MongoDB có thể duyệt qua chỉ mục theo một trong hai hướng. Tuy nhiên, đối với chỉ mục tổng hợp , 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ợ thao tác sắp xếp hay không.

Xem xét một bộ sưu tập

db.products.createIndex( { "item": 1, "stock": 1 } )
1 có chứa các tài liệu với các trường
db.products.createIndex( { "item": 1, "stock": 1 } )
2 và
db.products.createIndex( { "item": 1, "stock": 1 } )
3. Các ứng dụng có thể đưa ra các truy vấn trả về kết quả được sắp xếp trước theo giá trị
db.products.createIndex( { "item": 1, "stock": 1 } )
2 tăng dần và sau đó giảm dần (i. e. gần đây hơn đến cuối cùng)
db.products.createIndex( { "item": 1, "stock": 1 } )
3 giá trị, chẳng hạn như

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
9

hoặc các truy vấn trả về kết quả được sắp xếp trước theo giá trị

db.products.createIndex( { "item": 1, "stock": 1 } )
2 giảm dần và sau đó theo giá trị
db.products.createIndex( { "item": 1, "stock": 1 } )
3 tăng dần, chẳng hạn như

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2

Chỉ mục sau có thể hỗ trợ cả hai thao tác sắp xếp này

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
3

Tuy nhiên, chỉ mục trên không thể hỗ trợ sắp xếp theo giá trị

db.products.createIndex( { "item": 1, "stock": 1 } )
2 tăng dần và sau đó theo giá trị
db.products.createIndex( { "item": 1, "stock": 1 } )
3 tăng dần, chẳng hạn như sau

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
6

Để biết thêm thông tin về thứ tự sắp xếp và chỉ mục phức hợp, hãy xem Sử dụng Chỉ mục để Sắp xếp Kết quả Truy vấn

tiền tố

Tiền tố chỉ mục là tập hợp con bắt đầu của các trường được lập chỉ mục. Ví dụ, xét chỉ số hợp chất sau

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
7

Chỉ mục có các tiền tố chỉ mục sau

  • { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    20

  • { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    21

Đối với chỉ mục phức hợp, MongoDB có thể sử dụng chỉ mục để hỗ trợ các truy vấn trên tiền tố chỉ mục. Như vậy, MongoDB có thể sử dụng chỉ mục cho các truy vấn trên các trường sau

  • trường

    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    2,

  • trường

    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    2 và trường
    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    24,

  • trường

    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    2 và trường
    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    24 và trường
    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    3

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"}
2 và
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
3, vì trường
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2 tương ứng với một tiền tố. Tuy nhiên, trong trường hợp này, chỉ mục sẽ không hiệu quả trong việc hỗ trợ truy vấn như nếu chỉ mục chỉ có trên
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2 và
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
3. Các trường chỉ mục được phân tích cú pháp theo thứ tự;

Vì một truy vấn trên

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2 và
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
3 bỏ qua tiền tố chỉ mục
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
24 nên nó không thể sử dụng trường chỉ mục
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
3 theo sau
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
24. Chỉ trường
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
2 trong chỉ mục mới có thể hỗ trợ truy vấn này. Xem Tạo chỉ mục để hỗ trợ truy vấn của bạn để biết thêm thông tin

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"}
2, không có trường nào được liệt kê tương ứng với chỉ mục tiền tố

  • trường

    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    24,

  • trường

    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    3, hoặc

  • các trường

    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    24 và
    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
    3

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ó (e. g.

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
24 và
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
25), 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ố (e. g.
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
25). MongoDB sẽ sử dụng chỉ mục phức hợp trong tất cả các tình huống mà nó sẽ sử dụng chỉ mục tiền tố

Giao lộ chỉ mục

Bắt đầu từ phiên bản 2. 6, MongoDB có thể sử dụng giao điểm chỉ mục để thực hiện các truy vấn. Lựa chọn giữa việc tạo các chỉ mục phức hợp hỗ trợ các truy vấn của bạn hoặc dựa vào giao điểm của chỉ mục tùy thuộc vào các chi tiết cụ thể của hệ thống của bạn. Xem Giao lộ chỉ mục và Chỉ mục hợp chất để biết thêm chi tiết

Cân nhắc bổ sung

Các ứng dụng có thể bị giảm hiệu suất trong quá trình xây dựng chỉ mục, bao gồm quyền 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 phần Xây dựng chỉ mục trên các Bộ sưu tập phổ biến, bao gồm phần Xây dựng chỉ mục trong môi trường nhân rộng

Một số trình điều khiển có thể chỉ định các chỉ mục, sử dụng

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
27 thay vì
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases"}
9 làm thông số kỹ thuật. Điều này không có bất kỳ ảnh hưởng nào đến chỉ số kết quả

MongoDB có tự động lập chỉ mục không?

Mỗi bộ sưu tập trong MongoDB sẽ tự động có một chỉ mục trên trường _id . Chỉ mục này sau đó có thể được sử dụng để lấy tài liệu từ cơ sở dữ liệu một cách hiệu quả. Tuy nhiên, hầu hết thời gian bạn sẽ cần truy vấn dữ liệu trên các trường cụ thể khác. Đây là nơi một chỉ mục trường duy nhất sẽ có ích.

Chỉ mục nào được sử dụng cho nhiều trường trong MongoDB?

MongoDB hỗ trợ chỉ mục tổng hợp , trong đó một cấu trúc chỉ mục duy nhất chứa tham chiếu đến nhiều trường [1] trong tài liệu của bộ sưu tập.

Lập chỉ mục MongoDB hoạt động như thế nào?

MongoDB sử dụng chỉ mục đa khóa để lập chỉ mục nội dung được lưu trữ trong mảng . Nếu bạn lập chỉ mục cho một trường chứa giá trị mảng, MongoDB sẽ tạo các mục nhập chỉ mục riêng cho mọi phần tử của mảng. Các chỉ mục đa khóa này cho phép các truy vấn chọn tài liệu có chứa mảng bằng cách so khớp trên phần tử hoặc các phần tử của mảng.

Hạn chế của MongoDB là gì?

Kích thước tài liệu BSON tối đa là 16 megabyte . Kích thước tài liệu tối đa giúp đảm bảo rằng một tài liệu không thể sử dụng quá nhiều RAM hoặc quá nhiều băng thông trong quá trình truyền. Để lưu trữ tài liệu lớn hơn kích thước tối đa, MongoDB cung cấp GridFS API.