MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mẹo lập kế hoạch lược đồ MongoDB

Một trong những tính năng được quảng cáo nhiều nhất của MongoDB là khả năng "không phân biệt". Điều này có nghĩa là MongoDB không áp đặt bất kỳ lược đồ nào lên bất kỳ tài liệu nào được lưu trữ bên trong một bộ sưu tập. Thông thường, MongoDB lưu trữ tài liệu ở định dạng JSON nên mỗi tài liệu có thể lưu trữ nhiều loại lược đồ / cấu trúc khác nhau. Điều này có lợi cho các giai đoạn phát triển ban đầu nhưng trong các giai đoạn sau, bạn có thể muốn thực thi một số xác thực lược đồ trong khi chèn các tài liệu mới để có hiệu suất và khả năng mở rộng tốt hơn. Tóm lại, “Schemaless” không có nghĩa là bạn không cần thiết kế lược đồ của mình. Trong bài viết này, tôi sẽ thảo luận về một số mẹo chung để lập kế hoạch lược đồ MongoDB của bạn.

Việc tìm ra thiết kế lược đồ tốt nhất phù hợp với ứng dụng của bạn đôi khi có thể trở nên tẻ nhạt. Dưới đây là một số điểm mà bạn có thể cân nhắc khi thiết kế lược đồ của mình.

Tránh phát triển tài liệu

Nếu lược đồ của bạn cho phép tạo các tài liệu có kích thước lớn liên tục thì bạn nên thực hiện các bước để tránh điều này vì nó có thể dẫn đến việc giảm hiệu suất của DB và IO đĩa. Theo mặc định, MongoDB cho phép kích thước 16MB trên mỗi tài liệu. Nếu kích thước tài liệu của bạn tăng hơn 16 MB trong một khoảng thời gian thì đó là dấu hiệu của thiết kế giản đồ không tốt. Đôi khi, nó có thể dẫn đến việc không thực hiện được các truy vấn. Bạn có thể sử dụng nhóm tài liệu hoặc kỹ thuật phân bổ trước tài liệu để tránh tình trạng này. Trong trường hợp ứng dụng của bạn cần lưu trữ các tài liệu có kích thước lớn hơn 16 MB thì bạn có thể cân nhắc sử dụng MongoDB GridFS API.

Tránh cập nhật toàn bộ tài liệu

Nếu bạn cố gắng cập nhật toàn bộ tài liệu, MongoDB sẽ ghi lại toàn bộ tài liệu ở nơi khác trong bộ nhớ. Điều này có thể làm giảm đáng kể hiệu suất ghi của cơ sở dữ liệu của bạn. Thay vì cập nhật toàn bộ tài liệu, bạn có thể sử dụng công cụ sửa đổi trường để chỉ cập nhật các trường cụ thể trong tài liệu. Điều này sẽ kích hoạt cập nhật tại chỗ trong bộ nhớ, do đó hiệu suất được cải thiện.

Cố gắng tránh tham gia cấp ứng dụng

Như chúng ta đã biết, MongoDB không hỗ trợ kết hợp cấp máy chủ. Do đó, chúng ta phải lấy tất cả dữ liệu từ DB và sau đó thực hiện phép nối ở cấp ứng dụng. Nếu bạn đang truy xuất dữ liệu từ nhiều bộ sưu tập và kết hợp một lượng lớn dữ liệu, bạn phải gọi DB nhiều lần để có được tất cả dữ liệu cần thiết. Điều này rõ ràng sẽ đòi hỏi nhiều thời gian hơn vì nó liên quan đến mạng. Là một giải pháp cho trường hợp này, nếu ứng dụng của bạn phụ thuộc nhiều vào các phép nối thì giản đồ chuẩn hóa sẽ có ý nghĩa hơn. Bạn có thể sử dụng tài liệu nhúng để nhận tất cả dữ liệu cần thiết trong một lệnh gọi truy vấn.

Sử dụng lập chỉ mục thích hợp

Trong khi thực hiện tìm kiếm hoặc tổng hợp, người ta thường sắp xếp dữ liệu. Mặc dù bạn áp dụng để sắp xếp trong giai đoạn cuối của một đường dẫn, bạn vẫn cần một chỉ mục để bao gồm việc sắp xếp. Nếu chỉ mục trên trường sắp xếp không có sẵn, MongoDB buộc phải sắp xếp mà không có chỉ mục. Có giới hạn bộ nhớ là 32MB trên tổng kích thước của tất cả các tài liệu liên quan đến thao tác sắp xếp. Nếu MongoDB đạt đến giới hạn đó thì nó có thể tạo ra lỗi hoặc trả về một tập hợp trống.

Đã thảo luận về việc thêm các chỉ mục, điều quan trọng là không thêm các chỉ mục không cần thiết. Mỗi chỉ mục bạn thêm vào cơ sở dữ liệu, bạn phải cập nhật tất cả các chỉ mục này trong khi cập nhật tài liệu trong bộ sưu tập. Điều này có thể làm giảm hiệu suất cơ sở dữ liệu. Ngoài ra, mỗi chỉ mục cũng sẽ chiếm một số không gian và bộ nhớ, số lượng chỉ mục có thể dẫn đến các vấn đề liên quan đến lưu trữ.

Một cách khác để tối ưu hóa việc sử dụng chỉ mục là ghi đè trường _id mặc định. Mục đích duy nhất của trường này là giữ một trường duy nhất cho mỗi tài liệu. Nếu dữ liệu của bạn chứa dấu thời gian hoặc bất kỳ trường id nào thì bạn có thể ghi đè trường _id và lưu thêm một chỉ mục.

Vài người trở thành MongoDB DBA - Đưa MongoDB vào Sản xuất Tìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng MongoDBDownload miễn phí

Đọc v / s Tỷ lệ ghi

Việc thiết kế lược đồ cho bất kỳ ứng dụng nào phụ thuộc rất nhiều vào việc một ứng dụng được đọc nặng hay ghi nhiều. Ví dụ:nếu bạn đang xây dựng trang tổng quan để hiển thị dữ liệu chuỗi thời gian thì bạn nên thiết kế lược đồ của mình theo cách tối đa hóa thông lượng ghi. Nếu ứng dụng của bạn dựa trên nền tảng Thương mại điện tử thì hầu hết các hoạt động sẽ là hoạt động đọc vì hầu hết người dùng sẽ xem qua tất cả các sản phẩm và duyệt qua các danh mục khác nhau. Trong những trường hợp như vậy, bạn nên sử dụng lược đồ không chuẩn hóa để giảm số lượng lệnh gọi tới DB để lấy dữ liệu có liên quan.

Loại dữ liệu BSON

Đảm bảo rằng bạn xác định đúng kiểu dữ liệu BSON cho tất cả các trường trong khi thiết kế lược đồ. Vì khi bạn thay đổi kiểu dữ liệu của bất kỳ trường nào, MongoDB sẽ ghi lại toàn bộ tài liệu trong một không gian bộ nhớ mới. Ví dụ:nếu bạn cố gắng lưu trữ (int) 0 thay cho trường (float) 0.0, MongoDB sẽ ghi lại toàn bộ tài liệu tại một địa chỉ mới do thay đổi kiểu dữ liệu BSON.

Kết luận

Tóm lại, nên thiết kế lược đồ cho Cơ sở dữ liệu Mongo của bạn vì nó sẽ chỉ cải thiện hiệu suất ứng dụng của bạn. Bắt đầu từ phiên bản 3.2, MongoDB bắt đầu hỗ trợ xác thực tài liệu, nơi bạn có thể xác định trường nào được yêu cầu để chèn tài liệu mới. Từ phiên bản 3.6, MongoDB đã giới thiệu một cách thanh lịch hơn để thực thi xác thực lược đồ bằng cách sử dụng Xác thực lược đồ JSON. Sử dụng phương pháp xác thực này, bạn có thể thực thi kiểm tra kiểu dữ liệu cùng với kiểm tra trường bắt buộc. Bạn có thể sử dụng các phương pháp trên để kiểm tra xem tất cả các tài liệu có đang sử dụng cùng một loại lược đồ hay không.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Triển khai &định cấu hình các mảnh MongoDB với Ansible

  2. Ngoại lệ xác thực MongoCredential và Ngoại lệ Mongo Db chưa được phân loại

  3. Dữ liệu Ember phân cấp đa cấp với luôn được nhúng

  4. Những lý do nên và không nên chuyển từ máy chủ SQL sang MongoDB

  5. Gọi hàm bên trong tổng hợp mongodb?