Hướng dẫn which index is faster in mongodb? - chỉ mục nào nhanh hơn trong mongodb?

Chào mừng bạn đến với phần ba trong loạt bài đăng trên blog của chúng tôi bao gồm các thực tiễn tốt nhất cho MongoDB.

Trong loạt bài này, chúng tôi đang đề cập đến những cân nhắc chính để đạt được hiệu suất ở quy mô trên một số chiều quan trọng, bao gồm:

  • Mô hình hóa dữ liệu và bộ nhớ kích thước (bộ làm việc)
  • Các mẫu truy vấn và hồ sơ
  • Lập chỉ mục, mà chúng tôi sẽ bao gồm ngày hôm nay
  • Sharding
  • Giao dịch và đọc/viết mối quan tâm
  • Cấu hình phần cứng và hệ điều hành
  • Điểm chuẩn

Cả hai đã làm việc cho một vài nhà cung cấp cơ sở dữ liệu khác nhau trong 15 năm qua, chúng tôi có thể nói một cách an toàn rằng việc không xác định các chỉ mục phù hợp là các nhóm hỗ trợ kỹ thuật phát hành hiệu suất số một phải giải quyết với người dùng.

Vì vậy, chúng tôi cần phải làm cho nó đúng .. nơi này là những thực hành tốt nhất để giúp bạn.

Chỉ số trong MongoDB

Trong bất kỳ cơ sở dữ liệu nào, các chỉ mục hỗ trợ thực hiện hiệu quả các truy vấn. Không có chúng, cơ sở dữ liệu phải quét mọi tài liệu trong một bộ sưu tập hoặc bảng để chọn các tài liệu phù hợp với câu lệnh truy vấn. Nếu một chỉ mục thích hợp tồn tại cho một truy vấn, cơ sở dữ liệu có thể sử dụng chỉ mục để giới hạn số lượng tài liệu mà nó phải kiểm tra.

MongoDB cung cấp một loạt các loại chỉ mục và tính năng với các đơn đặt hàng dành riêng cho ngôn ngữ để hỗ trợ các mẫu truy cập phức tạp cho dữ liệu của bạn. Các chỉ mục MongoDB có thể được tạo và bỏ theo yêu cầu để đáp ứng các yêu cầu ứng dụng và mẫu truy vấn đang phát triển và có thể được khai báo trên bất kỳ trường nào trong tài liệu của bạn, bao gồm các trường được lồng trong các mảng.

Vì vậy, hãy đề cập đến cách bạn sử dụng tốt nhất các chỉ mục trong MongoDB.

Sử dụng các chỉ số hợp chất

Các chỉ số hợp chất là các chỉ số bao gồm một số trường khác nhau. Ví dụ: thay vì có một chỉ mục trên "họ" và một chỉ mục khác trên "tên đầu tiên", thường hiệu quả nhất khi tạo một chỉ mục bao gồm cả "họ" và "tên đầu tiên" nếu bạn truy vấn cả hai tên . Chỉ số hợp chất của chúng tôi vẫn có thể được sử dụng để lọc các truy vấn chỉ xác định tên cuối cùng.

Tuân theo quy tắc ESR

Đối với các chỉ mục ghép, quy tắc này rất hữu ích trong việc quyết định thứ tự của các trường trong chỉ mục:

  • Đầu tiên, thêm các trường đó mà các truy vấn bình đẳng được chạy.Equality queries are run.
  • Các trường tiếp theo được lập chỉ mục sẽ phản ánh thứ tự sắp xếp của truy vấn.Sort order of the query.
  • Các trường cuối cùng đại diện cho phạm vi dữ liệu cần truy cập.Range of data to be accessed.

Sử dụng các truy vấn được bảo hiểm khi có thể

Các truy vấn được bảo hiểm trả về kết quả từ một chỉ mục trực tiếp mà không phải truy cập các tài liệu nguồn và do đó rất hiệu quả.

Để một truy vấn được bảo hiểm, tất cả các trường cần thiết để lọc, sắp xếp và/hoặc được trả lại cho máy khách phải có mặt trong một chỉ mục. Để xác định xem một truy vấn có phải là truy vấn được bảo hiểm hay không, hãy sử dụng phương thức explain(). Nếu đầu ra explain() hiển thị totalDocsExamined là 0, điều này hiển thị truy vấn được bao phủ bởi một chỉ mục. Đọc thêm trong tài liệu để giải thích kết quả.

Một gotcha phổ biến khi cố gắng đạt được các truy vấn được bảo hiểm là trường _ID luôn được trả về theo mặc định. Bạn cần loại trừ rõ ràng nó khỏi kết quả truy vấn hoặc thêm nó vào chỉ mục.

Trong các cụm Sharded, MongoDB nội bộ cần truy cập vào các trường của khóa Shard. Điều này có nghĩa là các truy vấn được bảo hiểm chỉ có thể khi khóa Shard là một phần của chỉ mục. Nó thường là một ý tưởng tốt để làm điều này dù sao.

Sử dụng thận trọng khi xem xét các chỉ mục trên các trường quan trọng thấp

Các truy vấn trên các trường có một số lượng nhỏ các giá trị duy nhất (tính toán thấp) có thể trả về các bộ kết quả lớn. Các chỉ số hợp chất có thể bao gồm các trường có cardinality thấp, nhưng giá trị của các trường kết hợp sẽ thể hiện tính toán cao.

Loại bỏ các chỉ số không cần thiết

Các chỉ mục là tốn nhiều nguồn lực: ngay cả khi nén trong động cơ lưu trữ mongoDB Wiredtiger, chúng tiêu thụ RAM và đĩa. Khi các trường được cập nhật, các chỉ mục liên quan phải được duy trì, phát sinh chi phí CPU và đĩa I/O bổ sung.

MongoDB cung cấp công cụ để giúp bạn hiểu sử dụng chỉ mục, mà chúng tôi sẽ đề cập sau trong bài đăng này.

Các chỉ số ký tự đại diện không phải là sự thay thế cho lập kế hoạch chỉ số dựa trên khối lượng công việc

Đối với khối lượng công việc với nhiều mẫu truy vấn đặc biệt hoặc xử lý các cấu trúc tài liệu đa hình cao, các chỉ số ký tự đại diện cung cấp cho bạn rất nhiều sự linh hoạt hơn. Bạn có thể xác định một bộ lọc tự động lập chỉ mục tất cả các trường phù hợp, subdocument và mảng trong một bộ sưu tập.

Như với bất kỳ chỉ mục nào, họ cũng cần được lưu trữ và duy trì, vì vậy họ sẽ thêm chi phí vào cơ sở dữ liệu. Nếu các mẫu truy vấn ứng dụng của bạn được biết trước, thì bạn nên sử dụng các chỉ mục chọn lọc hơn trên các trường cụ thể được truy cập bởi các truy vấn.

Sử dụng tìm kiếm văn bản để phù hợp với các từ bên trong một trường

Các chỉ mục thông thường rất hữu ích để phù hợp với toàn bộ giá trị của một trường. Nếu bạn chỉ muốn khớp trên một từ cụ thể trong một trường có nhiều văn bản, thì hãy sử dụng chỉ mục văn bản.

Nếu bạn đang chạy MongoDB trong dịch vụ Atlas, hãy xem xét sử dụng tìm kiếm văn bản đầy đủ của ATLAS, cung cấp chỉ số Lucene được quản lý đầy đủ được tích hợp với cơ sở dữ liệu MongoDB. FTS cung cấp hiệu suất cao hơn và tính linh hoạt cao hơn để lọc, xếp hạng và sắp xếp thông qua cơ sở dữ liệu của bạn để nhanh chóng phát huy các kết quả phù hợp nhất cho người dùng của bạn.

Sử dụng các chỉ mục một phần

Giảm kích thước và hiệu suất chi phí của các chỉ mục chỉ bao gồm các tài liệu sẽ được truy cập thông qua chỉ mục. Ví dụ: tạo một chỉ mục một phần trên trường orderID chỉ bao gồm các tài liệu đặt hàng với orderStatus của "đang tiến hành" hoặc chỉ lập chỉ mục trường emailAddress cho các tài liệu tồn tại.

Tận dụng các chỉ mục đa khóa để truy vấn mảng

Nếu các mẫu truy vấn của bạn yêu cầu truy cập các yếu tố mảng riêng lẻ, hãy sử dụng chỉ mục đa khóa. MongoDB tạo một khóa chỉ mục cho từng phần tử trong mảng và có thể được xây dựng trên các mảng chứa cả các giá trị vô hướng và tài liệu lồng nhau.

Tránh các biểu thức chính quy không bị bỏ lại hoặc bắt nguồn

Các chỉ mục được đặt hàng theo giá trị. Các ký tự đại diện hàng đầu là không hiệu quả và có thể dẫn đến quét chỉ số đầy đủ. Trailing Wildcards có thể hiệu quả nếu có đủ các ký tự hàng đầu nhạy cảm trường hợp trong biểu thức.

Tránh trường hợp biểu hiện thông thường không nhạy cảm

Nếu lý do duy nhất để sử dụng Regex là trường hợp không nhạy cảm, hãy sử dụng chỉ số không nhạy cảm trường hợp, vì đó là nhanh hơn.

Sử dụng tối ưu hóa chỉ số có sẵn trong công cụ lưu trữ Wiredtiger

Nếu bạn đang tự quản lý MongoDB, bạn có thể tùy chọn đặt các chỉ mục vào khối lượng riêng của chúng, cho phép phân trang đĩa nhanh hơn và sự tranh chấp thấp hơn. Xem các tùy chọn Wiredtiger để biết thêm thông tin.

Sử dụng kế hoạch giải thích

Chúng tôi đã đề cập đến việc sử dụng kế hoạch giải thích MongoDB, trong các mẫu truy vấn trước đây và bài viết hồ sơ, và đây là công cụ tốt nhất để kiểm tra phạm vi bảo hiểm chỉ số cho các truy vấn riêng lẻ.

Làm việc từ kế hoạch giải thích, MongoDB cung cấp các công cụ trực quan để giúp cải thiện hơn nữa sự hiểu biết về các chỉ mục của bạn và cung cấp các khuyến nghị thông minh và tự động về các chỉ mục nào sẽ thêm.

Trực quan hóa phạm vi bảo hiểm chỉ số với Compass MongoDB và Atlas Data Explorer

Là GUI miễn phí cho MongoDB, La bàn cung cấp nhiều tính năng để giúp bạn tối ưu hóa hiệu suất truy vấn, bao gồm khám phá lược đồ của bạn và trực quan hóa các kế hoạch giải thích - hai lĩnh vực được đề cập trước đây trong loạt bài này.

Tab Indexes trong la bàn thêm một công cụ khác vào kho vũ khí của bạn. Nó liệt kê các chỉ mục hiện có cho một bộ sưu tập, báo cáo tên và khóa của chỉ mục, cùng với loại, kích thước và bất kỳ thuộc tính đặc biệt nào. Thông qua tab Index, bạn cũng có thể thêm và thả các chỉ mục khi cần thiết.

Hướng dẫn which index is faster in mongodb? - chỉ mục nào nhanh hơn trong mongodb?

Hình 1: Quản lý các chỉ mục với la bàn MongoDB

Một tính năng thực sự hữu ích là sử dụng chỉ mục, cho bạn thấy tần suất sử dụng chỉ mục. Có quá nhiều chỉ mục có thể gây hại cho hiệu suất của bạn vì có quá ít, việc làm cho tính năng này đặc biệt có giá trị trong việc giúp bạn xác định và xóa các chỉ mục không được sử dụng. Điều này giúp bạn miễn phí không gian thiết lập làm việc và loại bỏ chi phí cơ sở dữ liệu xuất phát từ việc duy trì chỉ mục.

Nếu bạn đang chạy MongoDB trong dịch vụ Atlas được quản lý đầy đủ của chúng tôi, chế độ xem các chỉ mục trong trình thám hiểm dữ liệu sẽ cung cấp cho bạn chức năng giống như la bàn, mà không cần kết nối với cơ sở dữ liệu của mình với một công cụ riêng.

Bạn cũng có thể truy xuất số liệu thống kê chỉ số bằng giai đoạn đường ống tổng hợp $indexStats.

Khuyến nghị chỉ số tự động

Ngay cả với tất cả các từ xa được cung cấp bởi các công cụ MongoDB, bạn vẫn chịu trách nhiệm kéo và phân tích dữ liệu cần thiết để đưa ra quyết định về các chỉ mục nào sẽ thêm.

Ngưỡng cho các truy vấn chậm thay đổi dựa trên thời gian hoạt động trung bình trên cụm của bạn để cung cấp các đề xuất phù hợp với khối lượng công việc của bạn.

Các chỉ mục được đề xuất được đi kèm với các truy vấn mẫu, được nhóm theo hình dạng truy vấn (nghĩa là, các truy vấn có cấu trúc vị ngữ, sắp xếp và phép chiếu tương tự), được chạy dựa trên một bộ sưu tập có lợi từ việc bổ sung một chỉ mục được đề xuất. Cố vấn hiệu suất không ảnh hưởng tiêu cực đến hiệu suất của các cụm Atlas của bạn.

Nếu bạn hài lòng với khuyến nghị, sau đó bạn có thể tự động triển khai các chỉ mục mới, mà không phải chịu bất kỳ thời gian chết ứng dụng nào.

Cái gì tiếp theo

Điều đó kết thúc phần mới nhất này của loạt thực hành tốt nhất hiệu suất. Đại học MongoDB cung cấp một khóa đào tạo dựa trên web miễn phí về hiệu suất MongoDB. Đây là một cách tuyệt vời để tìm hiểu thêm về sức mạnh của việc lập chỉ mục.

Tiếp theo trong loạt bài này: Sharding.

Làm thế nào để MongoDB chọn chỉ số nào để sử dụng?

MongoDB sử dụng các chỉ mục MultiKey để lập chỉ mục nội dung được lưu trữ trong các mảng. Nếu bạn lập chỉ mục một trường chứa giá trị mảng, MongoDB sẽ tạo các mục chỉ mục riêng cho mọi phần tử của mảng. Các chỉ mục đa năng này cho phép các truy vấn chọn các tài liệu có chứa mảng bằng cách khớp trên phần tử hoặc các phần tử của mảng.multikey indexes to index the content stored in arrays. If you index a field that holds an array value, MongoDB creates separate index entries for every element of the array. These multikey indexes allow queries to select documents that contain arrays by matching on element or elements of the arrays.

Làm cách nào để làm cho tìm kiếm MongoDB nhanh hơn?

Tối ưu hóa hiệu suất truy vấn..
Tạo các chỉ mục để hỗ trợ các truy vấn ..
Giới hạn số lượng kết quả truy vấn để giảm nhu cầu mạng ..
Sử dụng các dự đoán để chỉ trả về dữ liệu cần thiết ..
Sử dụng $ Gợi ý để chọn một chỉ mục cụ thể ..
Sử dụng toán tử gia tăng để thực hiện phía máy chủ hoạt động ..

Làm thế nào các chỉ mục có thể tăng tốc các truy vấn trong MongoDB?

Các chỉ mục lưu trữ một phần nhỏ của mỗi dữ liệu của mỗi bộ sưu tập được đặt thành các cấu trúc dữ liệu có thể truyền tải riêng biệt.Các chỉ mục này sau đó cho phép các truy vấn của bạn thực hiện ở tốc độ nhanh hơn bằng cách giảm thiểu số lượng truy cập đĩa cần thiết với mỗi yêu cầu.minimizing the number of disk accesses required with each request.

Điều gì làm cho MongoDB nhanh?

Vì các mô hình tài liệu của MongoDB lưu trữ dữ liệu liên quan đến nhau, nên việc truy xuất một tài liệu từ MongoDB thường nhanh hơn là tham gia dữ liệu trên nhiều bảng trong MySQL.MongoDB's document model stores related data together, it is often faster to retrieve a single document from MongoDB than to JOIN data across multiple tables in MySQL.