Chỉ mục sắp xếp MongoDB

Sau khi đọc tài liệu chính thức về chỉ mục, sắp xếp, sắp xếp giao nhau, tôi hơi mất phương hướng về cách mọi thứ hoạt động

Vấn đề tôi gặp phải là thực hiện một số truy vấn cần được sắp xếp và một bộ sưu tập lớn duy nhất (~ 4 triệu tài liệu)

Giả sử tôi có một tài liệu với 6 trường.  

Truy vấn tôi muốn đạt được như sau. db. bộ sưu tập của tôi. tìm một. "Được", b. đúng, c. "nhà cung cấp", d. đúng, e. { $gte. ISODate("2016-10-28T12. 00. 00Z"),$lt. ISODate("2016-10-28T12. 00. 10Z")} }). sắp xếp ({ f. 1 })

Bây giờ tôi đã tạo 2 chỉ mục

db. giao dịchEdr. createIndex({a. 1, b. 1, c. 1, d. 1, e. 1. Bối cảnh. thật})

db. giao dịchEdr. createIndex({f. 1. Bối cảnh. thật})

Với thiết lập này, tôi biết rằng tôi thực sự không sử dụng đầy đủ các chỉ mục, chỉ sử dụng một lần trên f và tôi mất rất nhiều thời gian để thực hiện truy vấn. Tôi đã đọc rằng hồng y & phạm vi là một vấn đề với kết hợp với một sắp xếp

bình đẳng. Sắp xếp. Phạm vi. Đây thường là thứ tự mà các trường được lập chỉ mục sẽ được thêm vào chỉ mục tổng hợp

bình đẳng

Có những trường hợp ngoại lệ đối với quy tắc này nhưng thông thường các trận đấu bình đẳng nên được ưu tiên trước. Các trận đấu bình đẳng có tính chọn lọc cao sẽ lọc khoảng 90% chỉ mục

Điều này nhanh chóng làm giảm số lượng hồ sơ phải trải qua các hoạt động dựa trên phạm vi và sắp xếp tốn kém hơn. Bằng cách loại bỏ toàn bộ DB của bạn không quan tâm, nó có thể dễ dàng thực hiện các loại không chặn hơn

Sắp xếp

Hãy nhớ rằng các chỉ mục lưu trữ các bản ghi theo thứ tự được sắp xếp

db.collection.createIndex({name:-1})

Điều này lưu trữ tên theo thứ tự giảm dần

Điều này có nghĩa là chúng ta có thể tận dụng các chỉ mục cho các thao tác sắp xếp

Điều này chỉ đúng nếu sắp xếp sử dụng cùng một chỉ mục như vị từ truy vấn

Nếu một chỉ mục không thể được sử dụng, thì các loại chặn bắt đầu xảy ra. Tất cả tài liệu đầu vào phải được sắp xếp trước khi quay lại

Đây là lý do tại sao các chỉ mục rất quan trọng để sắp xếp vì chúng ngăn chặn các loại sắp xếp

Phạm vi

tính chọn lọc

Các truy vấn có tính chọn lọc cao sẽ có hiệu suất tốt hơn nhiều. Truy vấn có tính chọn lọc cao là truy vấn loại bỏ 90% bản ghi trong chỉ mục/bộ sưu tập bằng đối sánh bằng

Khi tạo chỉ mục, điều quan trọng là phải hiểu cardinality. Cardinality đề cập đến tính duy nhất của các giá trị trong trường được lập chỉ mục

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.  

Chỉ mục sắp xếp MongoDB

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.  

Chỉ mục sắp xếp MongoDB

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

Chỉ mục sắp xếp MongoDB

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 thức createIndex() 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 bộ sưu tập của tài liệu< . Theo mặc định, tất cả các bộ sưu tập đều có chỉ mục trên trường . By default, all collections have an index on the _id. 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.

Chỉ mục sắp xếp MongoDB

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 .

Chỉ mục sắp xếp MongoDB

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. trọng lượng

Chỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

Đố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

Chỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

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.  

Chỉ mục sắp xếp MongoDB

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.
  • Các chỉ mục không gian địa lý  không thể  cover a query.
  • Bạn không thể ẩn  chỉ mục  _id .
  • Bạn không thể sử dụng gợi ý() 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.  

Chỉ mục sắp xếp MongoDB

Truy vấn

db. phim. tìm ({'loại'. 'phim', 'cà chua. sản xuất'. '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 xuất'. '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ỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

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ỉ mục sắp xếp MongoDB

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.

Chỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

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 xuất'. 'Hình ảnh phổ quát','type'. 'bộ phim'}). sắp xếp ({năm. -1}). giải thích ('executionStats')

Chỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

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 xuất'. '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')

Chỉ mục sắp xếp MongoDB

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 xuất'. 1 năm'. -1,’giải thưởng. chiến thắng. -1,'thời gian chạy'. 1})

Chỉ mục sắp xếp MongoDB

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 xuất'. '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')

Chỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

Chỉ mục sắp xếp MongoDB

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 xuất'. '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')

Chỉ mục sắp xếp MongoDB

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

Sắp xếp có sử dụng chỉ mục MongoDB không?

Vì các chỉ mục chứa các bản ghi được sắp xếp theo thứ tự, nên MongoDB có thể lấy kết quả sắp xếp từ một chỉ mục bao gồm các trường sắp xếp . MongoDB có thể sử dụng nhiều chỉ mục để hỗ trợ thao tác sắp xếp nếu việc sắp xếp sử dụng các chỉ mục giống như vị từ truy vấn.

Chỉ mục sắp xếp là gì?

Chỉ số sắp xếp(d, i) . Trong trường hợp hòa, thứ tự ban đầu được giữ nguyên. Nếu bỏ qua «i» thì «d» phải là mảng một chiều (i. e. một danh sách). Returns the elements of «i» re-arranged so that the values of «d» (which must be indexed by «i») are in ascending order. In the event of a tie, the original order is preserved. If «i» is omitted, «d» must be a one-dimensional array (i.e. a list).

Sắp xếp MongoDB có chậm không?

MongoDB thực hiện sắp xếp trong bộ nhớ. Tất cả các tài liệu được lưu trữ trên đĩa được đọc vào RAM, sau đó thuật toán sắp xếp được thực hiện. Việc sắp xếp trong bộ nhớ không hiệu quả, tốn thời gian và việc sắp xếp một số lượng lớn tài liệu trong bộ nhớ khá tốn kém . Ngoài ra, MongoDB hủy bỏ hoạt động nếu mức sử dụng bộ nhớ lớn hơn 32 MB.

Thứ tự của các trường có quan trọng trong MongoDB không?

Thông thường thứ tự các trường trong đối tượng JSON không quan trọng. Nhưng nó thực sự quan trọng đối với toán tử tổng hợp $sort. Vì vậy, tôi kết luận rằng MongoDB duy trì thứ tự của các trường trong tài liệu mà nó lưu trữ . Hoặc ít nhất là có thể bảo tồn nó.