MongoDB có hỗ trợ truy vấn phạm vi không?
Đ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 Show 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ư
và hai chỉ mục là
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ả 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ụcVí 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ụcMongoDB 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 đơnMongoDB 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ấtMongoDB 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
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
Đố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
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
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
Hy vọng blog này đã giúp bạn hiểu rõ hơn về Chỉ mục MongoDB. MongoDB không phù hợp với những tình huống nào?Một trong những nhược điểm của MongoDB là không hỗ trợ giao dịch . Mặc dù ngày càng có ít ứng dụng yêu cầu giao dịch nhưng vẫn có một số ứng dụng cần giao dịch để cập nhật nhiều tài liệu/bộ sưu tập. Nếu đó là chức năng cần thiết cho nhóm của bạn thì không nên sử dụng MongoDB.
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.
MongoDB có thể xử lý bao nhiêu truy vấn?Các truy vấn MongoDB được thực hiện thông qua Dịch vụ ứng dụng có thể trả về tối đa 50.000 tài liệu .
MongoDB có hỗ trợ truy vấn không?Bạn có thể sử dụng MongoDB Shell để truy vấn và cập nhật dữ liệu cũng như thực hiện các thao tác quản trị. |