Cách cải thiện truy vấn bằng lập chỉ mục MongoDB

Cach Cai Thien Truy Van Bang Lap Chi Muc Mongodb



Nâng cao tốc độ truy vấn là điều cần thiết cho MongoDB và tất cả các hệ thống cơ sở dữ liệu khác. Bằng cách xây dựng cấu trúc dữ liệu giúp MongoDB xác định các bản ghi nhanh hơn, lập chỉ mục là một cách tiếp cận mạnh mẽ để tăng tốc và tối ưu hóa tìm kiếm. Các chỉ mục bao gồm các bản sao của một số dữ liệu từ hồ sơ để giúp việc truy vấn hiệu quả hơn. Điều này hợp lý hóa nỗ lực liên quan đến việc đáp ứng các yêu cầu trong MongoDB. Trong hướng dẫn này, chúng ta sẽ thảo luận về việc sử dụng chỉ mục với sự trợ giúp của các loại chỉ mục khác nhau.

Tạo bộ sưu tập

Trước khi sử dụng chỉ mục, chúng ta phải tạo một bộ sưu tập mới trong MongoDB. Chúng tôi đã tạo một tài liệu và chèn 10 tài liệu, có tên là “Dummy”. Hàm find() MongoDB hiển thị tất cả các bản ghi từ bộ sưu tập “Dummy” trên màn hình shell MongoDB bên dưới.

kiểm tra> db.Dummy.find()







Chọn loại lập chỉ mục

Trước khi thiết lập chỉ mục, trước tiên bạn phải xác định các cột sẽ được sử dụng phổ biến trong tiêu chí truy vấn. Chỉ mục hoạt động tốt trên các cột thường xuyên được lọc, sắp xếp hoặc tìm kiếm. Các trường có số lượng lớn (nhiều giá trị khác nhau) thường là những lựa chọn lập chỉ mục tuyệt vời. Dưới đây là một số ví dụ về mã cho các loại chỉ mục khác nhau.



Ví dụ 01: Chỉ mục trường đơn

Đây có lẽ là loại chỉ mục cơ bản nhất, lập chỉ mục cho một cột duy nhất để nâng cao tốc độ truy vấn trên cột đó. Loại chỉ mục này được sử dụng cho các truy vấn trong đó bạn sử dụng một trường khóa duy nhất để truy vấn các bản ghi bộ sưu tập. Giả sử rằng bạn sử dụng trường “loại” để truy vấn các bản ghi của bộ sưu tập “Dummy” trong hàm tìm kiếm như bên dưới. Lệnh này sẽ xem qua toàn bộ bộ sưu tập, có thể mất nhiều thời gian để xử lý các bộ sưu tập lớn. Do đó, chúng ta cần tối ưu hóa hiệu suất của truy vấn này.



test> db.Dummy.find({type: 'emp' })





Các bản ghi của bộ sưu tập Giả ở trên đã được tìm thấy bằng cách sử dụng trường “loại”, tức là có chứa một điều kiện. Do đó, chỉ mục khóa đơn có thể được sử dụng ở đây để tối ưu hóa truy vấn tìm kiếm. Vì vậy, chúng tôi sẽ sử dụng hàm createIndex() của MongoDB để tạo chỉ mục trên trường “type” của bộ sưu tập “Dummy”. Hình minh họa về việc sử dụng truy vấn này hiển thị việc tạo thành công chỉ mục một khóa có tên “type_1” trên shell.

test> db.Dummy.createIndex({type: 1 })

Hãy sử dụng truy vấn find() khi nó sử dụng được trường “type”. Hoạt động bây giờ sẽ nhanh hơn đáng kể so với hàm find() được sử dụng trước đó vì chỉ mục đã có sẵn vì MongoDB có thể sử dụng chỉ mục để truy xuất nhanh các bản ghi với chức danh công việc được yêu cầu.



test> db.Dummy.find({type: 'emp' })

Ví dụ 02: Chỉ số ghép

Chúng tôi có thể muốn tìm kiếm các mục dựa trên các tiêu chí khác nhau trong một số trường hợp nhất định. Việc triển khai chỉ mục tổng hợp cho các trường này có thể giúp cải thiện hiệu suất truy vấn. Giả sử, lần này bạn muốn tìm kiếm từ bộ sưu tập “Dummy” bằng cách sử dụng nhiều trường chứa các điều kiện tìm kiếm khác nhau khi truy vấn hiển thị. Truy vấn này đang tìm kiếm các bản ghi từ bộ sưu tập trong đó trường “loại” được đặt thành “emp” và trường “sal” lớn hơn 350.

Toán tử logic $gte đã được sử dụng để áp dụng điều kiện cho trường “sal”. Tổng cộng có hai bản ghi được trả về sau khi tìm kiếm trong toàn bộ bộ sưu tập, bao gồm 10 bản ghi.

test> db.Dummy.find({type: 'emp' , chào: {$gte: 350 } })

Hãy tạo một chỉ mục ghép cho truy vấn nói trên. Chỉ mục ghép này có các trường “loại” và “sal”. Các số “1” và “-1” lần lượt thể hiện thứ tự tăng dần và giảm dần cho các trường “loại” và “sal”. Trình tự các cột của chỉ mục ghép rất quan trọng và phải tương ứng với các mẫu truy vấn. MongoDB đã đặt tên “type_1_sal_-1” cho chỉ mục ghép này như được hiển thị.

test> db.Dummy.createIndex({type: 1 , sẽ:- 1 })

Sau khi sử dụng cùng một truy vấn find() để tìm kiếm các bản ghi có giá trị trường “type” là “emp” và giá trị của trường “sal” lớn hơn 350, chúng ta đã thu được kết quả tương tự với một chút thay đổi về thứ tự so với kết quả truy vấn trước đó. Bản ghi giá trị lớn hơn cho trường “sal” hiện ở vị trí đầu tiên, trong khi bản ghi nhỏ nhất ở mức thấp nhất theo “-1” được đặt cho trường “sal” trong chỉ mục ghép ở trên.

test> db.Dummy.find({type: 'emp' , chào: {$gte: 350 } })

Ví dụ 03: Chỉ mục văn bản

Đôi khi, bạn có thể gặp phải tình huống phải xử lý một tập dữ liệu lớn, chẳng hạn như mô tả lớn về sản phẩm, thành phần, v.v. Chỉ mục văn bản có thể hữu ích khi thực hiện tìm kiếm toàn văn bản trên một trường văn bản lớn. Ví dụ: chúng tôi đã tạo một bộ sưu tập mới có tên “Thử nghiệm” trong cơ sở dữ liệu thử nghiệm của mình. Đã chèn tổng cộng 6 bản ghi vào bộ sưu tập này bằng hàm InsertMany() theo truy vấn find() bên dưới.

test> db.Test.insertMany([

{tên: 'Ana' , sau đó: 'Cô ấy sống ở London và là một giáo viên giỏi' },

{tên: 'Robert' , sau đó: 'Anh ấy quả là một cầu thủ bóng đá tuyệt vời' },

{tên: 'từ' , sau đó: 'Có thể đang đi du lịch Dubai' },

{tên: 'Jacob' , sau đó: 'Anh ấy rất thông minh và giàu có.' },

{tên: 'Cillian' , sau đó: 'Một bộ phim siêu khởi đầu đã nổi tiếng chỉ sau vài giây' },

{tên: 'Ken' , sau đó: 'Người yêu đồ ăn. Cô ấy cũng có thể ăn thịt bạn.' }

])

Bây giờ, chúng ta sẽ tạo chỉ mục văn bản trên trường “Des” của bộ sưu tập này, sử dụng hàm createIndex() của MongoDB. Từ khóa “văn bản” trong giá trị trường hiển thị loại chỉ mục, đó là chỉ mục “văn bản”. Tên chỉ mục, des_text, đã được tạo tự động.

test> db.Test.createIndex({ des: 'chữ' })

Bây giờ, hàm find() đã được sử dụng để thực hiện “tìm kiếm văn bản” trên bộ sưu tập thông qua chỉ mục “des_text”. Toán tử $search được sử dụng để tìm kiếm từ “food” trong bản ghi bộ sưu tập và hiển thị bản ghi cụ thể đó.

test> db.Test.find({ $text: { $search: 'đồ ăn' }});

Xác minh chỉ mục:

Bạn có thể kiểm tra và liệt kê tất cả các chỉ mục được áp dụng của các bộ sưu tập khác nhau trong MongoDB của mình. Để làm điều này, hãy sử dụng phương thức getIndexes() cùng với tên của bộ sưu tập trong màn hình shell MongoDB của bạn. Chúng tôi đã sử dụng lệnh này riêng cho bộ sưu tập “Thử nghiệm” và “Giả”. Điều này hiển thị tất cả thông tin cần thiết liên quan đến các chỉ mục tích hợp và do người dùng xác định trên màn hình của bạn.

kiểm tra> db.Test.getIndexes()

kiểm tra> db.Dummy.getIndexes()

Thả chỉ mục:

Đã đến lúc xóa các chỉ mục đã được tạo trước đó cho bộ sưu tập bằng hàm dropIndex() cùng với tên trường mà chỉ mục đã được áp dụng. Truy vấn dưới đây cho thấy chỉ mục duy nhất đã bị xóa.

test> db.Dummy.dropIndex({type: 1 })

Theo cách tương tự, chỉ số ghép có thể được loại bỏ.

test> chỉ mục db.Dummy.drop ({type: 1 , sẽ: 1 })

Phần kết luận

Bằng cách tăng tốc độ truy xuất dữ liệu từ MongoDB, việc lập chỉ mục là điều cần thiết để nâng cao hiệu quả của các truy vấn. Thiếu chỉ mục, MongoDB phải tìm kiếm toàn bộ bộ sưu tập để tìm các bản ghi phù hợp, việc này sẽ kém hiệu quả hơn khi kích thước của tập hợp tăng lên. Khả năng của MongoDB trong việc nhanh chóng khám phá các bản ghi phù hợp bằng cách sử dụng cấu trúc cơ sở dữ liệu chỉ mục sẽ tăng tốc quá trình xử lý các truy vấn khi sử dụng chỉ mục phù hợp.