Điều này không tuyệt chút nào. MongoDB xem xét 50.000 khóa và tài liệu [về cơ bản là toàn bộ bộ sưu tập], chỉ để trả lại 4 trong số chúng. Ngoài ra, hãy lưu ý giai đoạn có tên là “SORT_KEY_GENERATOR” ở đó. Sự tồn tại của giai đoạn này có nghĩa là MongoDB không thể sử dụng chỉ mục để trình bày kết quả được sắp xếp và do đó, thay vào đó, thực hiện sắp xếp trong bộ nhớ, giới hạn ở 32 MB. Nếu truy vấn của bạn trả về một tập hợp kết quả lớn vượt quá 32 MB, thì truy vấn sẽ không thành công. Xem Sử dụng chỉ mục để sắp xếp kết quả truy vấn
Chúng tôi có thể cải thiện điều này bằng cách cấu trúc lại truy vấn của bạn [bằng cách mở gói câu lệnh $or] và tạo một vài chỉ mục để hỗ trợ cả hai điều khoản của truy vấn $or
Truy vấn được cấu trúc lại trông giống như
{$or:[
{sender:"Oscar", amount_sent:10, start: {$gte: 1467295200, $lte: 1483189200}},
{receiver:"Oscar", amount_sent:10, start: {$gte: 1467295200, $lte: 1483189200}}
]}
và hai chỉ mục là {sender:1, amount_sent:1, start:1}
và {receiver:1, amount_sent:1, start:1}
, để đáp ứng cả hai điều khoản của truy vấn $or. Kết quả explain[]
tôi nhận được là
> db.test.explain['executionStats'].find[{$or:[{sender:"Oscar", amount_sent:10, start: {$gte: 1467295200, $lte: 1483189200}}, {receiver:"Oscar", amount_sent:10, start: {$gte: 1467295200, $lte: 1483189200}}]}].sort[{start:-1}]
...
"nReturned": 4,
"executionTimeMillis": 1,
"totalKeysExamined": 4,
"totalDocsExamined": 4,
...
"stage": "SORT_MERGE",
...
Truy vấn được cấu trúc lại và hai chỉ mục có vẻ hoạt động tốt với nhau. Bây giờ MongoDB trả về 4 tài liệu và đã kiểm tra chính xác cùng một số khóa chỉ mục và tài liệu. Cũng lưu ý sự tồn tại của giai đoạn “SORT_MERGE”. Về cơ bản, đây là giai đoạn hợp nhất của sắp xếp hợp nhất, không bị ràng buộc với giới hạn 32 MB. Giai đoạn này hợp nhất hai kết quả [đã được sắp xếp] cho từng cụm từ $or. Ngoài ra, thời gian thực hiện truy vấn giảm từ 118 ms xuống chỉ còn 1 ms
Xin lưu ý rằng phân tích tôi đã thực hiện chủ yếu là phỏng đoán có học vì tôi không biết bản chất chính xác của dữ liệu của bạn. Để tối ưu hóa trường hợp sử dụng của bạn, tôi khuyến khích bạn hiểu đầy đủ về kết quả explain[]
. https. // tài liệu. mongodb. com/v3. 2/tham khảo/giải thích-kết quả/
Với sự trợ giúp của các chỉ mục, chúng tôi có thể tránh việc thu thập các bản quét. Chỉ mục là cấu trúc dữ liệu đặc biệt lưu trữ một phần nhỏ tập dữ liệu của bộ sưu tập ở dạng dễ tra cứu. Chỉ mục lưu trữ giá trị của một trường cụ thể hoặc một tập hợp các trường, được sắp xếp theo giá trị của các trường. Thứ tự của các mục nhập chỉ mục hỗ trợ khớp đẳng thức hiệu quả và các hoạt động truy vấn dựa trên phạm vi. Ngoài ra, MongoDB cũng có thể trả về kết quả được sắp xếp bằng cách sử dụng thứ tự trong chỉ mục. Hãy cố gắng hiểu điều này với sự trợ giúp của một số ví dụ.
chỉ mục mặc định
Đã tạo cơ sở dữ liệu mới có tên search và một bộ sưu tập có tên esr . We simply added a sample document {name. ”Ashnik”} vào bộ sưu tập của esr, đã xác minh dữ liệu và lập chỉ mục. Hãy kiểm tra chỉ mục mặc định {“_id”. 1} . Chúng tôi không thể xóa các trường ‘_id’ nhưng có thể cập nhật các giá trị. Nếu chúng tôi không chèn bất kỳ dữ liệu nào vào trường ‘ _id ‘, MongoDB sẽ tạo một ObjectId duy nhất.
Chúng ta có thể thấy ObjectId trong ảnh chụp màn hình bên dưới.
Tạo chỉ mục
Ví dụ sau tạo chỉ mục tăng dần của một trường trên trường tên . Chúng ta có thể tạo thứ tự giảm dần bằng cách thay đổi 1 thành -1.
db. sai lầm. createIndex[{tên. 1}]
Bây giờ, chúng ta có 2 chỉ mục. Một trên _id và một trên các trường tên . Tên mặc định cho một chỉ mục là sự kết hợp của các khóa được lập chỉ mục và hướng của từng khóa trong chỉ mục [i. e. , 1 hoặc -1] sử dụng dấu gạch dưới làm dấu phân cách. Ví dụ: một chỉ mục được tạo trên {item. 1, số lượng. -1} có tên mặt hàng_1_số lượng_-1 .
Bạn có thể tạo chỉ mục với tên tùy chỉnh, chẳng hạn như tên dễ đọc hơn tên mặc định. Ví dụ: hãy xem xét một ứng dụng thường xuyên truy vấn bộ sưu tập sản phẩm để điền dữ liệu vào khoảng không quảng cáo hiện có. Phương pháp sau đây tạo chỉ mục cho truy vấn mặt hàng và số lượng được đặt tên cho khoảng không quảng cáo.
db. Mỹ phẩm. createIndex[ {mục. 1, số lượng. –1}, {tên. “truy vấn khoảng không quảng cáo”} ]Các loại chỉ mục
MongoDB cung cấp các loại chỉ mục khác nhau để hỗ trợ các loại dữ liệu và truy vấn cụ thể
Hãy thảo luận về các chỉ mục trường đơn và phức hợp để hiểu thêm về tiền tố chỉ mục, ESR và thứ tự sắp xếp
Chỉ mục trường đơn
MongoDB cung cấp hỗ trợ đầy đủ cho các chỉ mục trên bất kỳ loại trường nào trong của . Theo mặc định, tất cả các bộ sưu tập đều có chỉ mục trên . Chúng tôi có thể thêm các chỉ mục bổ sung để hỗ trợ các truy vấn ứng dụng của mình.
Trước đó, chúng tôi đã tạo chỉ mục tăng dần trên tên của trường esr collection. 1 defines an ascending order and -1 is the descending order.
db. sai lầm. createIndex[{tên. 1}]
Bây giờ, chúng tôi đã thêm vị trí [tài liệu được nhúng] vào tài liệu hiện có. Nhìn vào tài liệu dưới đây. Hãy xem cách chúng ta có thể tạo một chỉ mục trường duy nhất trên các tài liệu được nhúng.
Thao tác sau đây tạo chỉ mục trên vị trí. trường thành phố
db. sai lầm. createIndex[{ “vị trí. thành phố” . 1}]
Trường vị trí là một tài liệu được nhúng, chứa các trường thành phố và địa chỉ. Lệnh sau tạo một chỉ mục trên trường vị trí .
db. sai lầm. createIndex[{vị trí. 1}]
chỉ số hợp chất
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 các tham chiếu đến nhiều trường trong tài liệu của bộ sưu tập.
db. thu thập. tạo Index [ {
Bây giờ, chúng tôi đã thêm một tài liệu khác vào bộ sưu tập esr chứa các trường mặt hàng, danh mục, địa điểm và kho hàng .
Thao tác sau đây tạo chỉ mục tăng dần trên mặt hàng và kho fields
db. sai lầm. createIndex[{ “item” . 1, “hàng” . 1 }]
Các truy vấn bên dưới sẽ sử dụng chỉ mục [{ “item” . 1, “hàng tồn kho” . 1 }. Thứ tự của các trường không quan trọng nhưng tiền tố mới quan trọng.
db. sai lầm. tìm[ { mục. “Quả táo” }]db. sai lầm. tìm[ { mục. “Apple” , còn hàng. { $lt. 5}}]db. sai lầm. tìm[ { kho. { $lt. 5 }, mục. “Quả táo” }]
nhưng không
db. sai lầm. tìm[ { kho. { $lt. 5 }]
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ũng 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 mặt hàng cũng như cả trường mặt hàng và kho hàng. Tiền tố chỉ mục là bắt đầu tập hợp con của các trường được lập chỉ mục. Ví dụ, xét chỉ số hợp chất sau.
{ “mặt hàng” . 1, “vị trí” . 1, “hàng” . 1}
Chỉ mục có các tiền tố chỉ mục sau
- {mục. 1}
- {mục. 1, vị trí. 1}
Các truy vấn sau sẽ sử dụng Chỉ mục
db. sai lầm. tìm[ { mục. “Táo” }]db. sai lầm. tìm[ { mục. “Apple” , vị trí. “36 Đường Robinson” }]
db. sai lầm. tìm[ { mục. “Apple” ,vị trí. “36 Đường Robinson” , còn hàng. { $lt. 5}}]nhưng không
db. sai lầm. tìm[ { vị trí. “36 Đường Robinson” , hàng. { $lt. 5 }}]
Hãy thử lấy thêm thông tin chỉ mục bằng cách sử dụng lệnh thống kê bộ sưu tập. Thống kê với chỉ mụcChi tiết. tùy chọn true cung cấp thêm thông tin như số lượng chỉ mục, kích thước từng tệp chỉ mục và vị trí lưu trữ chỉ mục đó và tên tệp là gì
Bây giờ, chúng ta biết rõ ràng rằng
- esr được lưu trữ trong tệp collection-0-8597612610530926898. wt
- _id index được lưu trữ trong index-1-8597612610530926898. wt
- Tên_1 chỉ mục được lưu trữ trong chỉ mục-4-8597612610530926898. wt
Đối với mỗi bộ sưu tập hoặc chỉ mục, công cụ lưu trữ WiredTiger sẽ ghi một tệp riêng lẻ là tệp danh mục MDB chứa danh mục của tất cả các bộ sưu tập và chỉ mục khác nhau
Theo mặc định, kích thước chỉ mục hiển thị theo byte. Bạn có thể chỉ định tỷ lệ để hiển thị bằng KB hoặc MB hoặc GB. Bây giờ, chúng ta biết mỗi chỉ mục chiếm bao nhiêu dung lượng. Chúng tôi có thể sử dụng thông tin này khi bạn nghĩ về những thay đổi về cấu hình hoặc bộ đệm.
Giới hạn chỉ mục
- Một bộ sưu tập có thể có không hơn 64 .
- Không thể có nhiều hơn 32 trường trong chỉ mục kết hợp .
- Multikey không thể bao gồm các truy vấn trên [các] trường mảng.
- không thể .
- Bạn không thể ẩn chỉ mục _id .
- Bạn không thể sử dụng trên chỉ mục ẩn.
E S R – Bình đẳng Sắp xếp Range
Chúng tôi làm việc trên một bộ sưu tập phim để hiểu thêm về các quy tắc ESR. Hãy khám phá những gì hiện có bằng cách xem xét dữ liệu.
Truy vấn
db. phim. tìm [{'loại'. 'phim', 'cà chua. sản lượng'. 'Hình ảnh phổ quát','thời gian chạy'. {$gt. 50}}]. sắp xếp [{năm. -1}]. giải thích ['executionStats']
Truy vấn của chúng tôi chứa đẳng thức ['type'. 'phim', 'cà chua. sản lượng'. 'Hình ảnh phổ quát'], sắp xếp [{năm. -1}] và phạm vi ['thời gian chạy'. {$gt. 50}]. Chúng tôi có thể tìm thấy các số liệu thống kê thực hiện bằng cách sử dụng giải thích. Bây giờ hãy kiểm tra các chi tiết của winPlan. Quá trình quét toàn bộ bộ sưu tập đã diễn ra và nó đã kiểm tra 23539 tài liệu và 371 tài liệu đã được trả lại. Hiện tại chúng tôi chưa tạo bất kỳ Chỉ mục nào. Hãy tạo một Chỉ mục và xác minh lại điều này
Chỉ số ghép trên loại, cà chua. các trường sản xuất, năm và thời gian chạy , chúng tôi có thể xác minh bằng phương thức getIndexes. Thứ tự của các trường trong khi tạo Chỉ mục sẽ quan trọng. Thực hiện theo các quy tắc ESR và quyết định thứ tự của các trường.
Chúng tôi chạy cùng một truy vấn và xác minh lại số liệu thống kê thực thi. Xem giai đoạn. ‘IXSCAN’ . Nó sử dụng một chỉ mục. Chúng ta có thể tìm thấy chỉ mục nào được sử dụng trong tên chỉ mục. Nhìn vào totaldocsExamined và nReturned đang hiển thị 371. Thay vì quét toàn bộ bộ sưu tập, nó chỉ quét Chỉ mục và trả về đầu ra được yêu cầu. Làm việc với các chỉ mục luôn nhanh hơn quét bộ sưu tập. Hầu hết thời gian Chỉ mục sẽ phù hợp với bộ nhớ. Điều đó sẽ giúp chúng tôi đạt được hiệu suất tốt hơn. Ngược lại, số lượng Index nhiều sẽ ảnh hưởng đến hiệu suất ghi. Thỉnh thoảng chúng tôi phải kiểm tra các chỉ mục của mình và xóa các Chỉ mục không sử dụng.
Bây giờ, chúng ta xáo trộn thứ tự của các trường Bình đẳng và Phạm vi. Hãy xem liệu chỉ mục của chúng tôi có hữu ích hay không. Kết quả là nó sử dụng một Index. Kiểm tra số liệu thống kê thực hiện để xác nhận.
Truy vấn
db. phim. tìm [{'thời gian chạy'. {$gt. 50},’cà chua. sản lượng'. 'Hình ảnh phổ quát','type'. 'bộ phim'}]. sắp xếp [{năm. -1}]. giải thích ['executionStats']
Chúng tôi đã thêm một trường sắp xếp khác 'giải thưởng. chiến thắng. -1. Hãy nhớ rằng chúng tôi không đưa trường này vào chỉ mục. Nhìn vào số liệu thống kê thực hiện. Bây giờ IXSCAN cũng đã xảy ra nhưng chúng ta có thể thấy SORT bổ sung đó do 'giải thưởng. lĩnh vực chiến thắng.
Truy vấn
db. phim. tìm [{'loại'. 'phim', 'cà chua. sản lượng'. 'Hình ảnh phổ quát','thời gian chạy'. {$gt. 50}}]. sắp xếp [{năm. -1,’giải thưởng. chiến thắng. -1}]. giải thích ['executionStats']
Một lần nữa, chúng tôi đã tạo thêm một Chỉ mục. Nhìn vào các chỉ số có sẵn dưới đây
db. phim. createIndex[{'type'. 1, 'cà chua. sản lượng'. 1 năm'. -1,’giải thưởng. chiến thắng. -1,'thời gian chạy'. 1}]
Kiểm tra số liệu thống kê thực thi cho truy vấn bên dưới. Nó đã sử dụng Chỉ mục được tạo mới nhất của chúng tôi. Kiểm tra kế hoạch chiến thắng và bị từ chối. Kế hoạch chiến thắng chứa Chỉ mục được tạo gần đây của chúng tôi và không có giai đoạn SẮP XẾP
Truy vấn
db. phim. tìm [{'loại'. 'phim', 'cà chua. sản lượng'. 'Hình ảnh phổ quát','thời gian chạy'. {$gt. 50}}]. sắp xếp [{năm. -1,’giải thưởng. chiến thắng. -1}]. giải thích ['executionStats']
Cuối cùng, hãy thay đổi thứ tự của các trường trong phần sắp xếp và xác minh thống kê thực thi. Kế hoạch chiến thắng đang hiển thị chỉ số 1st của chúng tôi.
Truy vấn
db. phim. tìm [{'loại'. 'phim', 'cà chua. sản lượng'. 'Hình ảnh phổ quát','thời gian chạy'. {$gt. 50}}]. sắp xếp [{'giải thưởng. chiến thắng. -1 năm. -1}]. giải thích ['executionStats']
Dưới đây là một số điểm chính về thứ tự các trường trong truy vấn
- Thứ tự của các vị từ truy vấn không quan trọng
- Thứ tự của các trường sắp xếp không thành vấn đề
- Thứ tự của các khóa chỉ mục/tiền tố trong vấn đề chỉ mục ghép
Truy vấn sử dụng chỉ mục vì nó tuân theo quy tắc ESR. Đối với các chỉ mục phức hợp, quy tắc ngón tay cái này hữu ích trong việc quyết định thứ tự các trường trong chỉ mục
- Đầu tiên, thêm các trường mà truy vấn đẳng thức được chạy
- Các trường tiếp theo được lập chỉ mục phải phản ánh thứ tự sắp xếp của truy vấn
- Các trường cuối cùng đại diện cho phạm vi dữ liệu được truy cập
Hy vọng blog này đã giúp bạn hiểu rõ hơn về Chỉ mục MongoDB.
Nếu bạn cần tư vấn, đăng ký, các dịch vụ kỹ thuật hoặc được quản lý cho MongoDB hãy liên hệ với các chuyên gia của chúng tôi. Luôn cập nhật các công nghệ cơ sở dữ liệu nguồn mở hơn như MongoDB, Postgres, Redis, ELK, v.v., phải không