Làm thế nào chúng ta có thể lập chỉ mục trong mongodb?

Một chỉ mục trong MongoDB tương tự như cách các chỉ mục hoạt động trong các hệ thống cơ sở dữ liệu khác. Các chỉ mục được áp dụng ở cấp bộ sưu tập và có thể lưu trữ giá trị của một trường hoặc tập hợp trường cụ thể, được sắp xếp theo giá trị của trường

Tại sao việc lập chỉ mục lại quan trọng trong MongoDB?

Các chỉ mục trong MongoDB giúp tránh phải thực hiện quét bộ sưu tập, yêu cầu quét mọi tài liệu trong bộ sưu tập để tìm kết quả phù hợp với truy vấn của bạn [xem. tốn thời gian và nguồn lực]. Với các chỉ mục phù hợp, bạn có thể truy vấn hiệu quả hơn vì số lượng tài liệu bị hạn chế ngay từ đầu

Mặc dù có thể lưu trữ rất nhiều thông tin trong cơ sở dữ liệu MongoDB, nhưng bạn cần có một chiến lược lập chỉ mục hiệu quả để lấy thông tin bạn cần từ đó một cách nhanh chóng và hiệu quả.

Trong hướng dẫn này, tôi sẽ tìm hiểu một số điều cơ bản về cách sử dụng các chỉ mục MongoDB với các truy vấn đơn giản, bỏ qua các bản cập nhật và phần chèn

Đây là một cách tiếp cận thực tế chỉ với đủ lý thuyết để cho phép bạn thử các ví dụ. Mục đích là cho phép người đọc chỉ sử dụng shell, mặc dù nó dễ dàng hơn rất nhiều trong GUI MongoDB mà tôi đã sử dụng, Studio 3T

Bạn không có thời gian để làm theo các ví dụ?

Khi MongoDB nhập dữ liệu của bạn vào một bộ sưu tập, nó sẽ tạo một khóa chính được thực thi bởi một chỉ mục

Nhưng nó không thể đoán các chỉ mục khác mà bạn cần vì không có cách nào nó có thể dự đoán loại tìm kiếm, sắp xếp và tổng hợp mà bạn sẽ muốn thực hiện trên dữ liệu này

Nó chỉ cung cấp một mã định danh duy nhất cho mỗi tài liệu trong bộ sưu tập của bạn, mã này được giữ lại trong tất cả các chỉ mục khác. MongoDB không cho phép đống. – dữ liệu chưa được lập chỉ mục được liên kết với nhau chỉ bằng con trỏ tiến và lùi

MongoDB cho phép bạn tạo các chỉ mục bổ sung tương tự như thiết kế của các chỉ mục được tìm thấy trong cơ sở dữ liệu quan hệ và những chỉ mục này cần một lượng quản trị nhất định

Như với các hệ thống cơ sở dữ liệu khác, có các chỉ mục đặc biệt cho dữ liệu thưa thớt, để tìm kiếm thông qua văn bản hoặc để chọn thông tin không gian

Bất kỳ một truy vấn hoặc cập nhật nào thường sẽ chỉ sử dụng một chỉ mục duy nhất nếu có sẵn một chỉ mục phù hợp. Một chỉ mục thường có thể giúp thực hiện bất kỳ hoạt động dữ liệu nào, nhưng điều này không phải lúc nào cũng đúng

Bạn có thể muốn thử phương pháp 'súng phân tán' – tạo nhiều chỉ mục khác nhau, để đảm bảo rằng sẽ có một chỉ mục phù hợp –  nhưng nhược điểm là mỗi chỉ mục sử dụng tài nguyên và cần được hệ thống duy trì

Nếu bạn lạm dụng các chỉ mục, chúng sẽ thống trị các trang bộ nhớ và dẫn đến I/O đĩa quá mức. Một số lượng nhỏ các chỉ số hiệu quả cao là tốt nhất

Một bộ sưu tập nhỏ có khả năng phù hợp với bộ đệm nên công việc cung cấp chỉ mục và truy vấn điều chỉnh dường như sẽ có nhiều ảnh hưởng đến hiệu suất tổng thể

Tuy nhiên, khi kích thước tài liệu tăng lên và số lượng tài liệu tăng lên, công việc đó bắt đầu. Cơ sở dữ liệu của bạn sẽ mở rộng tốt

Để minh họa một số khái niệm cơ bản về chỉ mục, chúng tôi sẽ tải 70.000 khách hàng vào. Mỗi tài liệu ghi lại tên, địa chỉ, số điện thoại, chi tiết thẻ tín dụng và 'ghi chú tệp' của khách hàng. Chúng đã được tạo ra từ các số ngẫu nhiên

Việc tải này có thể được thực hiện từ mongoimport hoặc từ một công cụ như Studio 3T

Bạn có thể tải dữ liệu thử nghiệm được sử dụng trong bài viết tại đây

Trước khi bạn tạo một bộ sưu tập, bạn cần xem xét đối chiếu, cách thực hiện tìm kiếm và sắp xếp [đối chiếu không được hỗ trợ trước MongoDB 3. 4]

Khi bạn thấy các chuỗi theo thứ tự, bạn có muốn xem chữ thường được sắp xếp sau chữ hoa hay việc sắp xếp của bạn nên bỏ qua chữ hoa chữ thường?

Để biết đối chiếu nào, nếu có, được sử dụng cho bộ sưu tập của bạn, bạn có thể sử dụng lệnh này [ở đây dành cho bộ sưu tập 'Khách hàng' của chúng tôi. ]

db.getCollectionInfos[{name: 'Customers'}]
[email protected]" }, { "_id" : NumberInt[0], "EmailAddresses.$.EmailAddress" : NumberInt[1], "Full Name" : NumberInt[1] }];

cái nào mang lại

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
0

Điều này cho chúng tôi biết rằng Cassie Barker có địa chỉ email [email được bảo vệ] từ ngày 11 tháng 1 năm 2016 đến ngày 25 tháng 1 năm 2018. Khi chúng tôi chạy truy vấn, phải mất 240 ms vì không có chỉ mục hữu ích [nó đã kiểm tra tất cả 40000 tài liệu trong COLLSCAN]

Chúng ta có thể tạo một chỉ mục để trợ giúp điều này

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
1

Chỉ số này đã giảm thời gian thực hiện xuống còn 6ms

Chỉ mục Nad là chỉ mục duy nhất có sẵn cho bộ sưu tập chỉ có trên Tên. trường Họ

Đối với giai đoạn Đầu vào, chiến lược IXSCAN đã được sử dụng và trả về rất nhanh 33 tài liệu phù hợp, tiếp tục

Sau đó, nó lọc các tài liệu phù hợp đó để lấy mảng EmailAddresses cho địa chỉ mà sau đó được trả về trong giai đoạn chiếu. Tổng cộng 3 Ms đã được sử dụng, trái ngược với 70 Ms mà nó đã sử dụng

Việc bổ sung các trường khác trong chỉ mục không có tác dụng rõ rệt. Trường chỉ mục đầu tiên đó là trường quyết định thành công

Điều gì sẽ xảy ra nếu chúng tôi chỉ muốn biết ai đang sử dụng một địa chỉ email cụ thể?

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
2

Ở đây, một chỉ mục trên trường Địa chỉ email hoạt động kỳ diệu. Nếu không có chỉ mục phù hợp, nó sẽ thực hiện COLLSCAN, mất khoảng 70 Ms trên máy chủ nhà phát triển của tôi

Với chỉ số…

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
3

… thời gian đã quá nhanh để đo lường

Bạn sẽ nhận thấy rằng, để lập chỉ mục cho một trường chứa giá trị mảng, MongoDB tạo khóa chỉ mục cho từng phần tử trong mảng

Chúng tôi có thể làm cho nó nhanh hơn nữa nếu chúng tôi cho rằng các địa chỉ email là duy nhất [trong dữ liệu giả mạo này thì không phải như vậy và trong cuộc sống thực, đó là một giả định nguy hiểm. ]

Chúng ta cũng có thể sử dụng chỉ mục để 'che' việc truy xuất trường 'Tên đầy đủ', để MongoDB có thể truy xuất giá trị này từ chỉ mục thay vì truy xuất nó từ cơ sở dữ liệu, nhưng tỷ lệ thời gian tiết kiệm được sẽ ít

Một lý do khiến truy xuất chỉ mục hoạt động hiệu quả là chúng có xu hướng đạt được tỷ lệ truy cập cao hơn nhiều trong bộ nhớ đệm so với quét toàn bộ bộ sưu tập. Tuy nhiên, nếu tất cả bộ sưu tập có thể nằm gọn trong bộ đệm thì quá trình quét bộ sưu tập sẽ thực hiện gần với tốc độ chỉ mục hơn

Hãy xem những tên phổ biến nhất trong danh sách khách hàng của chúng tôi là gì, bằng cách sử dụng tổng hợp. Chúng tôi sẽ cung cấp một chỉ mục về “Tên. Họ"

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
4

Vì vậy, trong top 10 của chúng tôi, chúng tôi có rất nhiều gia đình Snyder

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
5

Điều này chỉ mất 8 Ms mặc dù đã thực hiện COLLSCAN vì toàn bộ cơ sở dữ liệu có thể được lưu trong bộ nhớ cache

Nó sử dụng cùng một kế hoạch truy vấn ngay cả khi bạn thực hiện tổng hợp trên một trường chưa được lập chỉ mục. [Elisha, Eric, Kim và Lee là những cái tên phổ biến. ]

Tôi tự hỏi những cái tên nào có xu hướng thu hút nhiều ghi chú nhất trong hồ sơ của họ?

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
6

Trong dữ liệu giả mạo của tôi, những người tên là Charisse nhận được nhiều ghi chú nhất. Ở đây chúng tôi biết rằng COLLSCAN là không thể tránh khỏi vì số lượng ghi chú sẽ thay đổi trong hệ thống trực tiếp. Một số cơ sở dữ liệu cho phép lập chỉ mục trên các cột được tính nhưng điều này sẽ không giúp được gì ở đây

db.createCollection["Customers", {collation:{locale:"en",strength:1}}]
7

Hiệu suất của các tập hợp có thể được cải thiện bởi một chỉ mục vì chúng có thể bao gồm tập hợp. Chỉ các nhà khai thác đường ống $match và $sort mới có thể tận dụng trực tiếp một chỉ mục và sau đó chỉ khi chúng xuất hiện ở đầu đường ống

kết luận

  • Khi bạn đang phát triển chiến lược lập chỉ mục cho MongoDB, bạn sẽ thấy rằng có một số yếu tố cần tính đến, chẳng hạn như cấu trúc dữ liệu, kiểu sử dụng và cấu hình của máy chủ cơ sở dữ liệu
  • MongoDB thường chỉ sử dụng một chỉ mục khi thực hiện truy vấn, cho cả tìm kiếm và sắp xếp;
  • Hầu hết các bộ sưu tập dữ liệu đều có một số ứng cử viên khá tốt cho các chỉ mục, có khả năng phân biệt rõ ràng giữa các tài liệu trong bộ sưu tập và có khả năng phổ biến trong việc thực hiện tìm kiếm
  • Bạn nên thận trọng với các chỉ mục vì chúng có chi phí nhỏ về tài nguyên. Mối nguy hiểm lớn hơn là quên những gì đã có, mặc dù rất may là không thể tạo các chỉ mục trùng lặp trong MongoDB
  • Vẫn có thể tạo một số chỉ số phức hợp rất gần với hiến pháp của chúng. Nếu một chỉ mục không được sử dụng, tốt nhất là bỏ nó
  • Chỉ mục hợp chất rất tốt trong việc hỗ trợ các truy vấn. Những trường này sử dụng trường đầu tiên để thực hiện tìm kiếm, sau đó sử dụng các giá trị trong các trường khác để trả về kết quả, thay vì phải lấy các giá trị từ tài liệu. Chúng cũng hỗ trợ các loại sử dụng nhiều trường, miễn là theo đúng thứ tự
  • Để các chỉ mục có hiệu quả đối với việc so sánh chuỗi, chúng cần sử dụng cùng một phép đối chiếu
  • Cần theo dõi hiệu suất của các truy vấn. Cũng như việc sử dụng các giá trị được trả về từ giải thích [], nó trả tiền cho các truy vấn thời gian và kiểm tra các truy vấn chạy lâu bằng cách bật cấu hình và kiểm tra các truy vấn chậm. Việc chuyển đổi tốc độ của các truy vấn như vậy thường dễ dàng một cách đáng ngạc nhiên bằng cách cung cấp đúng chỉ mục

Đối với các chỉ mục MongoDB, v.v., hãy dùng thử Studio 3T, MongoDB IDE có GUI đầy đủ tính năng cho phép bạn thêm và sửa đổi các chỉ mục, đồng thời chỉ định đối chiếu của chúng, tạo truy vấn trực quan, v.v.

Làm cách nào để tạo chỉ mục trong MongoDB?

Chỉ mục có thể được tạo bằng cách sử dụng phương thức createIndex . Chỉ mục có thể được tạo trên chỉ một trường hoặc nhiều giá trị trường. Các chỉ mục có thể được tìm thấy bằng cách sử dụng phương thức getIndexes. Các chỉ mục có thể được xóa bằng cách sử dụng dropIndex cho các chỉ mục đơn lẻ hoặc dropIndexes để loại bỏ tất cả các chỉ mục.

Có thể lập chỉ mục trong MongoDB không?

MongoDB cung cấp phương thức có tên là createIndex[] cho phép người dùng tạo chỉ mục . Khóa xác định trường trên cơ sở bạn muốn tạo chỉ mục và 1 [hoặc -1] xác định thứ tự sắp xếp các chỉ mục này [tăng dần hoặc giảm dần].

Các chỉ mục MongoDB được triển khai như thế nào?

Các chỉ mục được triển khai MongoDB sử dụng db. tên bộ sưu tập. createIndex[] và đối với mỗi bộ sưu tập mới được tạo, một chỉ mục mặc định được tạo bằng “_id” và chỉ mục này không thể bị xóa. Chúng tôi đã tìm hiểu về nhiều loại chỉ mục có thể được tạo.

Phương pháp nào được sử dụng để tạo chỉ mục trong MongoDB?

Phương thức createIndex[] được sử dụng để tạo chỉ mục

Chủ Đề