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.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 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.
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. trọng lượ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
- 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.
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ỉ 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 xuất'. '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 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']
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}]
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']
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']
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