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.
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.