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

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}{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ả/

Hãy nói về MongoDB Indexes và các chủ đề liên quan của nó. Chúng ta đều biết rằng các chỉ mục có thể cải thiện hiệu quả của hoạt động đọc. Quét toàn bộ bộ sưu tập cho một tài liệu là không tốt. Ví dụ. Bạn có 1 triệu tài liệu trong một bộ sưu tập và bạn đang tìm kiếm một tài liệu cụ thể với các tiêu chí lọc – nếu bạn không có các chỉ mục thích hợp hỗ trợ các truy vấn, nó sẽ quét toàn bộ bộ sưu tập và trả về kết quả. Bạn đã nhận được kết quả, nhưng ý định của bạn là truy xuất chúng trong một khoảng thời gian tối ưu. Ở đây chúng ta đang nói về 1 triệu tài liệu, nhưng trong kịch bản trong thế giới thực, nó mở rộng lên số lượng tài liệu cao hơn nhiều.  

MongoDB có hỗ trợ truy vấn phạm vi không?

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.  

MongoDB có hỗ trợ truy vấn phạm vi không?

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})

MongoDB có hỗ trợ truy vấn phạm vi không?

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.

MongoDB có hỗ trợ truy vấn phạm vi khô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 .

MongoDB có hỗ trợ truy vấn phạm vi khô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

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi khô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

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi không?

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.  

MongoDB có hỗ trợ truy vấn phạm vi không?

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.  

MongoDB có hỗ trợ truy vấn phạm vi khô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í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

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi không?

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.

MongoDB có hỗ trợ truy vấn phạm vi khô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.

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi khô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')

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi không?

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')

MongoDB có hỗ trợ truy vấn phạm vi không?

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})

MongoDB có hỗ trợ truy vấn phạm vi không?

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')

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi không?

MongoDB có hỗ trợ truy vấn phạm vi không?

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')

MongoDB có hỗ trợ truy vấn phạm vi không?

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

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ị.