Thực tiễn tốt nhất về chuỗi thời gian MongoDB

Mỗi mục trong cơ sở dữ liệu của tôi có một mảng giá trị cho nhiều ngôn ngữ. Vì vậy, toàn bộ dữ liệu tại một thời điểm có thể trông như thế này

{ 
  productId: 1,
  locale: 'US',
  votes: [0,2,5],
  date: ISODate('2022-01-01T00:00:00Z')
}

Sẽ có một bản ghi tương tự, có cùng ngày, cho nhiều ngôn ngữ và mỗi bản ghi có mảng phiếu bầu riêng

Các bản ghi sẽ không thường xuyên hơn hàng giờ, nhưng có lẽ chỉ sáu giờ một lần

Có thể còn lâu mảng votes mới có giá trị khác. Vì vậy, đó có thể là một số bản ghi mỗi ngày chứa cùng một giá trị chỉ với các thời điểm khác nhau

Và sau đó nhân số này với bao nhiêu ngôn ngữ tôi theo dõi. Giả sử đó là US, CA và AU

Tôi đã xem bản trình bày này, vì vậy tôi hiểu rằng một loạt bản ghi được lưu trữ dưới dạng một mảng trong một tài liệu duy nhất, dựa trên trường meta

Nhưng tôi có một số câu hỏi về cách cấu trúc và lưu trữ chuỗi này dưới dạng chuỗi thời gian MongoDB

1. Tôi có nên lưu trữ các ngôn ngữ sâu hơn trong bản ghi của từng sản phẩm, trông giống như thế này không?

[{ 
  productId: 1, // This would be the "meta" field
  us: [0,2,5],
  ca: [0,4,1],
  au: [1,0,1],
  timestamp: ISODate('2022-01-01T00:00:00Z')
}]

Hoặc

[{ 
  productId: 1, // This would be the "meta" field
  locales: {
    us: [0,2,5],
    ca: [0,4,1],
    au: [1,0,1],
  },
  timestamp: ISODate('2022-01-01T00:00:00Z')
}]

Hoặc sẽ tốt hơn nếu tách từng ngôn ngữ thành một phần của meta, như thế này?

[{ 
  meta: { productId: 1, locale: 'US' },
  votes: [0,2,5],
  timestamp: ISODate('2022-01-01T00:00:00Z')
},
{ 
  meta: { productId: 1, locale: 'CA' },
  votes: [0,4,1],
  timestamp: ISODate('2022-01-01T00:00:00Z')
},
{ 
  meta: { productId: 1, locale: 'AU' },
  votes: [1,0,1],
  timestamp: ISODate('2022-01-01T00:00:00Z')
}]

2. Có một phương pháp hay để tối ưu hóa dữ liệu lặp lại hay chuỗi thời gian MongoDB đã làm điều đó chưa?

Vì vậy, nếu tôi có 100 bản ghi liên tiếp mà tất cả đều giống nhau votes: [0,2,5], liệu MongoDB có tối ưu hóa bản ghi đó không?

Hay tôi chỉ nên làm cho hệ thống của mình lưu một bản ghi mới nếu mảng votes đã thay đổi kể từ bản ghi cuối cùng?

MongoDB là cơ sở dữ liệu tài liệu NoSQL hàng đầu dành cho các nhà phát triển hiện đại làm việc trên các ứng dụng hiệu năng cao. Với các tài liệu giống như JSON, MongoDB nổi bật với khả năng chia tỷ lệ theo chiều ngang và cân bằng tải, mang đến cho các nhà phát triển sự cân bằng tuyệt vời giữa khả năng tùy chỉnh và khả năng mở rộng

Nhưng giống như bất kỳ công cụ hiệu suất cao nào, MongoDB hoạt động tốt nhất trong tay của một chuyên gia biết họ đang làm gì. Các vấn đề về hiệu suất có thể chỉ ra rằng cơ sở dữ liệu không hoạt động hiệu quả nhất có thể và các tối ưu hóa cụ thể có thể dẫn đến hiệu suất tốt hơn

Trong bài đăng này, chúng tôi sẽ tập trung vào cách đạt được hiệu suất ở quy mô lớn bằng cách sử dụng MongoDB bằng cách xem

Xin lưu ý rằng các phương pháp hay nhất mà chúng tôi sẽ đề cập là không đầy đủ (điều đó sẽ yêu cầu một bài đăng dài hơn nhiều)

Ai nên đọc hướng dẫn này?

Mặc dù bất kỳ ai quan tâm đến nền tảng cơ sở dữ liệu tài liệu đều có thể học được điều gì đó từ bài đăng này, nhưng có thể bạn sẽ thấy thông tin này đặc biệt hữu ích nếu bạn

  • Bắt đầu dự án đầu tiên của bạn với tư cách là nhà phát triển MongoDB dày dạn kinh nghiệm

  • Chạy MongoDB trên Atlas, dịch vụ cơ sở dữ liệu đám mây toàn cầu được quản lý hoàn toàn

  • Tự quản lý MongoDB


Câu hỏi thường gặp về hiệu suất MongoDB

Nếu bạn chỉ có vài phút rảnh rỗi, câu hỏi thường gặp về hiệu suất nhanh này có thể hữu ích

1. Tại sao MongoDB có hiệu năng cao?

Truy vấn đặc biệt, lập chỉ mục và tổng hợp thời gian thực cung cấp các cách mạnh mẽ để truy cập dữ liệu. MongoDB là một cơ sở dữ liệu phân tán theo mặc định, cho phép mở rộng khả năng mở rộng theo chiều ngang mà không có bất kỳ thay đổi nào đối với logic ứng dụng


2. Các truy vấn MongoDB nhanh như thế nào?

Khá nhanh. Truy vấn khóa chính hoặc chỉ mục sẽ chỉ mất vài mili giây. Các truy vấn không có chỉ mục phụ thuộc vào kích thước bộ sưu tập và thông số kỹ thuật của máy, v.v.


3. Làm cách nào tôi có thể làm cho MongoDB nhanh hơn?

Nó phụ thuộc vào những gì bạn đang và chưa làm. Hãy thử thêm các chỉ số. Không tham gia (tốt hơn là nhúng). Nâng cấp thông số kỹ thuật máy của bạn. Và, nếu bạn chưa có, chắc chắn hãy thử sharding để chia tỷ lệ theo chiều ngang


4. MongoDB cần bao nhiêu RAM?

MongoDB cần đủ RAM để giữ bộ làm việc của bạn trong bộ nhớ. Tất nhiên, câu trả lời chính xác phụ thuộc vào kích thước dữ liệu và khối lượng công việc của bạn. Bạn có thể sử dụng MongoDB Atlas để tự động mở rộng quy mô


5. MongoDB có tốt cho dữ liệu lớn không?

Vâng, nó chắc chắn nhất là. MongoDB rất tốt cho các tập dữ liệu lớn. MongoDB Atlas có thể xử lý các truy vấn được liên kết trên bộ lưu trữ đối tượng (e. g. , Amazon S3) và lưu trữ tài liệu



Nếu không có gì khó chịu, hãy xem qua 5 phương pháp hay nhất hàng đầu để đạt được hiệu suất cao nhất từ ​​​​cơ sở dữ liệu MongoDB của bạn


Thực hành tốt nhất #1. Kiểm tra các mẫu truy vấn và hồ sơ

Hầu hết các nhà phát triển sẽ đồng ý rằng bước đầu tiên trong việc tối ưu hóa hiệu suất là hiểu các mẫu truy vấn thực tế và mong đợi. Khi bạn biết rõ các mẫu truy vấn của ứng dụng của mình như lòng bàn tay, bạn có thể thiết kế mô hình dữ liệu của mình và chọn các chỉ số phù hợp tương ứng

Với MongoDB, các nhà phát triển có quyền truy cập vào một số công cụ mạnh mẽ có thể giúp họ cải thiện đáng kể hiệu suất—nhưng điều đó không có nghĩa là các mẫu truy vấn và cấu hình có thể bị bỏ qua.

Ví dụ: một cách dễ dàng để tăng cường hiệu suất là chỉ cần phân tích các mẫu truy vấn của bạn và xác định nơi bạn có thể nhúng dữ liệu thay vì thực hiện liên kết trong ứng dụng hoặc trong cơ sở dữ liệu

Các cách khác để cải thiện hiệu suất MongoDB sau khi xác định các mẫu truy vấn chính của bạn bao gồm

  • Lưu trữ kết quả của các truy vấn phụ thường xuyên trên tài liệu để giảm tải đọc

  • Đảm bảo rằng bạn có các chỉ mục trên bất kỳ trường nào bạn thường xuyên truy vấn

  • Xem nhật ký của bạn để xác định các truy vấn chậm, sau đó kiểm tra các chỉ số của bạn

Thực hành tốt nhất #2. Xem lại mô hình dữ liệu và lập chỉ mục

MongoDB được chú ý nhờ lược đồ linh hoạt, nhưng điều này không có nghĩa là bạn có thể bỏ qua các phương pháp hay nhất về thiết kế lược đồ. Bạn phải luôn tìm ra lược đồ của mình khi bắt đầu dự án để sau này bạn không phải trang bị lại mọi thứ. Điều này áp dụng 100% cho các mô hình dữ liệu của bạn

Trong khi thiết kế mô hình dữ liệu của mình, bạn phải quyết định cách lập mô hình mối quan hệ giữa dữ liệu. Thay vào đó, việc quyết định thời điểm nhúng một tài liệu hoặc tạo một tham chiếu giữa các tài liệu riêng biệt trong các bộ sưu tập khác nhau là một cân nhắc dành riêng cho ứng dụng

Một lợi thế chính của các tài liệu JSON là chúng cho phép các nhà phát triển lập mô hình dữ liệu tuy nhiên ứng dụng yêu cầu. Các mảng và tài liệu con lồng nhau cho phép bạn lập mô hình các mối quan hệ phức tạp giữa dữ liệu bằng các tài liệu văn bản đơn giản

Nhưng sử dụng MongoDB, bạn cũng có thể lập mô hình

  • cấu trúc phẳng, dạng bảng và dạng cột

  • cặp khóa-giá trị đơn giản

  • dữ liệu không gian địa lý

  • dữ liệu chuỗi thời gian

  • các nút và cạnh của cấu trúc dữ liệu đồ thị được kết nối, v.v.

Mô hình hóa dữ liệu là một chủ đề rộng lớn và trải dài mà bạn có thể dành hàng tháng để tìm hiểu về nó. Nếu bạn chưa có, đây là một số tài nguyên có thể giúp ích

  1. Tài liệu MongoDB bao gồm một phần tuyệt vời về mô hình hóa dữ liệu, bắt đầu từ việc lập kế hoạch cho mô hình dữ liệu tài liệu của bạn và đi vào chi tiết về các chi tiết cụ thể như nhúng và tham chiếu

  2. Đại học MongoDB cung cấp khóa đào tạo miễn phí về mô hình hóa dữ liệu. Đây là một cách tuyệt vời cho người mới bắt đầu với thiết kế lược đồ và mô hình dữ liệu tài liệu

Thực hành tốt nhất #3. Hãy thử nhúng và tham khảo

Phần mở rộng tự nhiên của mô hình hóa dữ liệu, nhúng cho phép bạn tránh kết hợp ứng dụng, giúp giảm thiểu các truy vấn và cập nhật

Đáng chú ý, dữ liệu với 1. 1 mối quan hệ nên được nhúng trong một tài liệu. Dữ liệu với 1. nhiều mối quan hệ trong đó "nhiều" đối tượng xuất hiện cùng hoặc được xem cùng với tài liệu gốc của chúng cũng là những ứng cử viên tuyệt vời để nhúng. Bởi vì các loại dữ liệu này luôn được truy cập cùng nhau, nên việc lưu trữ chúng cùng nhau trong cùng một tài liệu sẽ rất hợp lý

Nhúng thường cung cấp hiệu suất tốt hơn cho các hoạt động đọc do loại vị trí dữ liệu này. Các mô hình dữ liệu được nhúng cũng cho phép các nhà phát triển cập nhật dữ liệu liên quan trong một thao tác ghi vì ghi một tài liệu là giao dịch

Tuy nhiên, không phải tất cả 1. 1 và 1. nhiều mối quan hệ là những ứng cử viên tốt để nhúng vào một tài liệu. Đó là nơi tham chiếu giữa các tài liệu trong các bộ sưu tập khác nhau xuất hiện

Tham chiếu có ý nghĩa hơn nhiều khi mô hình hóa nhiều. nhiều mối quan hệ. Tuy nhiên, bất cứ khi nào tham chiếu, ứng dụng của bạn phải đưa ra các truy vấn tiếp theo để giải quyết mọi tham chiếu. Đổi lại, điều này đòi hỏi nhiều chuyến đi khứ hồi hơn đến máy chủ

Bạn nên cân nhắc tham khảo khi

  • Một tài liệu được truy cập thường xuyên nhưng chứa dữ liệu hiếm khi được sử dụng. Nhúng sẽ chỉ làm tăng yêu cầu trong bộ nhớ, vì vậy tham chiếu có thể có ý nghĩa hơn

  • Một phần của tài liệu được cập nhật thường xuyên và tiếp tục dài hơn, trong khi phần còn lại của tài liệu tương đối tĩnh

  • Kích thước tài liệu vượt quá giới hạn tài liệu 16 MB của MongoDB. Điều này có thể xảy ra khi lập mô hình nhiều. 1 mối quan hệ, chẳng hạn như đánh giá sản phẩm. sản phẩm, ví dụ

Thực hành tốt nhất #4. Xác định việc sử dụng bộ nhớ (dễ dàng hơn trong Atlas)

Như với hầu hết các cơ sở dữ liệu, MongoDB hoạt động tốt nhất khi bộ làm việc của ứng dụng (e. g. , chỉ mục và dữ liệu được truy cập thường xuyên) phù hợp với bộ nhớ mà không gặp sự cố. Mặc dù các yếu tố khác đóng vai trò quan trọng trong hiệu suất, nhưng rõ ràng kích thước RAM là yếu tố quan trọng nhất cần cân nhắc khi định cỡ phiên bản

Khi bộ làm việc của ứng dụng phù hợp với RAM, hoạt động đọc từ đĩa sẽ ở mức thấp. Nhưng nếu bộ làm việc của bạn vượt quá RAM của kích thước phiên bản hoặc máy chủ, thì hoạt động đọc sẽ bắt đầu tăng lên. Nếu bạn nhận thấy điều này xảy ra, bạn có thể giải quyết vấn đề bằng cách chuyển sang một phiên bản lớn hơn với nhiều bộ nhớ hơn

Hoặc bạn có thể phân vùng (phân đoạn) cơ sở dữ liệu của mình trên nhiều máy chủ (thêm về điều này sau)

Định cỡ đúng bộ làm việc của bạn là rất quan trọng cho dù bạn đang chạy MongoDB Atlas hay tự mình quản lý MongoDB. Nếu bạn đang sử dụng Atlas, hãy nhớ luôn xem lại tài liệu lựa chọn cấp và kích thước Atlas của bạn để tính toán chính xác kích thước của bộ làm việc của bạn

Cần chỉ ra rằng trong MongoDB Atlas, việc mở rộng bộ nhớ được tự động hóa và đơn giản. Chẳng hạn, bạn có thể chọn tham gia tự động thay đổi quy mô cấp cụm, tự động điều chỉnh công suất tính toán để đáp ứng với những thay đổi theo thời gian thực trong nhu cầu của ứng dụng

Thực hành tốt nhất #5. Giám sát sao chép và sharding

Không có cuộc thảo luận nào về việc tăng hiệu suất hoặc mở rộng quy mô theo chiều ngang mà không đề cập đến việc sao chép, giúp tăng tính khả dụng của dữ liệu thông qua chia tỷ lệ theo chiều ngang. Sao chép có thể dẫn đến hiệu suất tốt hơn và cũng cung cấp khả năng dự phòng, mang lại tính bảo mật cao hơn

Trong MongoDB, việc sao chép được thực hiện thông qua các bộ bản sao cho phép các nhà phát triển sao chép dữ liệu từ một máy chủ chính hoặc nút trên nhiều máy chủ phụ. Điều này cho phép ứng dụng của bạn chạy một số truy vấn trên truy vấn phụ thay vì truy vấn chính, tránh tranh chấp và giúp cải thiện cân bằng tải

Các bộ bản sao cung cấp một số lợi thế cho các nhà phát triển MongoDB

  • Dự phòng và tính sẵn sàng của dữ liệu. Bản sao có thể rất hữu ích trong trường hợp xảy ra các sự kiện thảm khốc như lỗi phần cứng hoặc sự cố máy chủ. Nếu một nút chính không thành công, quy trình bầu chọn sẽ tự động chọn một nút chính mới từ các nút phụ còn lại

  • chia sẻ tải. Bộ bản sao cung cấp khả năng mở rộng tốt hơn cho các ứng dụng của bạn. Ví dụ: nhà phát triển có thể định cấu hình ứng dụng của họ để đọc từ nhiều máy chủ nhằm trợ giúp cân bằng tải giữa các bộ bản sao

  • Vị trí dữ liệu. Về hiệu suất, sao chép cũng cải thiện độ trễ cho việc sử dụng đọc. Nếu bạn có cùng một dữ liệu trải rộng trên nhiều máy chủ, dữ liệu đó có thể được truy cập tại vị trí gần người dùng cuối nhất

Các cụm phân mảnh trong MongoDB là một cách khác để có khả năng cải thiện hiệu suất. Giống như sao chép, sharding là một cách để phân phối các tập dữ liệu lớn trên nhiều máy chủ. Sử dụng cái được gọi là khóa phân đoạn, nhà phát triển có thể sao chép các mẩu dữ liệu (hoặc “phân đoạn”) trên nhiều máy chủ. Các máy chủ này hoạt động cùng nhau để sử dụng tất cả dữ liệu

Sharding đi kèm với một số lợi thế, bao gồm chia tỷ lệ theo chiều ngang để đọc/ghi cũng như tăng dung lượng lưu trữ và tính khả dụng cao hơn

Hãy nhớ rằng các phương pháp hay nhất không ngừng được cải thiện

Một lần nữa, đây là danh sách không đầy đủ về các phương pháp hay nhất về hiệu suất hàng đầu cho MongoDB. Như bất kỳ nhà phát triển cơ sở dữ liệu có kinh nghiệm nào cũng sẽ cho bạn biết, có cả nghìn lẻ một thứ bạn có thể làm để cải thiện hiệu suất—và tất cả chúng đều phụ thuộc vào ứng dụng chính xác của bạn

Quan trọng hơn, hãy luôn nhớ rằng việc lập mô hình, lập chỉ mục, nhúng và tham chiếu dữ liệu phù hợp là những cân nhắc cơ bản. Giả sử bạn biết rõ về các mẫu truy vấn của ứng dụng của mình, bạn sẽ thấy rằng bạn có thể đạt được hiệu suất ổn định và nhiều lợi ích bổ sung từ bản chất phân tán và nhân rộng của MongoDB

Nếu vẫn thất bại. chúng tôi đã đề cập rằng MongoDB Atlas cũng có Trình cố vấn hiệu suất tích hợp chưa?

MongoDB có tốt cho dữ liệu chuỗi thời gian không?

MongoDB là cơ sở dữ liệu có mục đích chung dựa trên tài liệu với thiết kế lược đồ linh hoạt và ngôn ngữ truy vấn phong phú. Kể từ MongoDB 5. 0, MongoDB vốn hỗ trợ dữ liệu chuỗi thời gian .

Làm cách nào để tối ưu hóa hiệu suất MongoDB?

Tối ưu hóa hiệu suất truy vấn .
Tạo chỉ mục để hỗ trợ 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 phép chiếu để chỉ trả lại dữ liệu cần thiết
Sử dụng $hint để chọn một chỉ mục cụ thể
Sử dụng toán tử gia tăng để thực hiện thao tác phía máy chủ

Làm cách nào để lưu trữ thời gian trong MongoDB?

MongoDB lưu trữ thời gian ở dạng UTC theo mặc định và sẽ chuyển đổi bất kỳ biểu thị giờ địa phương nào sang dạng này. Các ứng dụng phải vận hành hoặc báo cáo về một số giá trị thời gian địa phương chưa sửa đổi có thể lưu trữ múi giờ cùng với dấu thời gian UTC và tính toán thời gian địa phương ban đầu trong logic ứng dụng của chúng.

Bộ sưu tập chuỗi thời gian trong MongoDB là gì?

MongoDB coi các bộ sưu tập chuỗi thời gian là các chế độ xem không cụ thể hóa có thể ghi được hỗ trợ bởi một bộ sưu tập nội bộ . Khi bạn chèn dữ liệu, bộ sưu tập nội bộ sẽ tự động sắp xếp dữ liệu chuỗi thời gian thành định dạng lưu trữ được tối ưu hóa. Khi bạn truy vấn các bộ sưu tập chuỗi thời gian, bạn thao tác trên một tài liệu cho mỗi phép đo.