Anophel-آنوفل بهترین روش های MongoDB: بهینه سازی عملکرد

بهترین روش های MongoDB: بهینه سازی عملکرد

انتشار:
1

MongoDB به عنوان یک راه حل قدرتمند دیتابیس NoSQL که انعطاف پذیری، مقیاس پذیری و سهولت استفاده را ارائه می دهد، محبوبیت گسترده ای به دست آورده است. با این حال، برای استفاده از پتانسیل کامل آن، توسعه دهندگان باید به بهترین شیوه هایی که عملکرد و قابلیت اطمینان بهینه را تضمین می کند، پایبند باشند. در این مقاله از آنوفل، بهترین روش‌های ضروری MongoDB را بررسی می‌کنیم که می‌تواند به شما در ایجاد برنامه‌های کاربردی قوی کمک کند.

1. مدل سازی داده برای عملکرد:

مدل سازی دقیق داده ها در MongoDB بسیار مهم است. بر خلاف دیتابیس‌های رابطه‌ای سنتی، MongoDB بدون اسکیما است و انعطاف‌پذیری را امکان‌پذیر می‌کند اما نیاز به طراحی متفکرانه دارد. نکات زیر را در نظر بگیرید:

Embedding در مقابل Referencing : تصمیم بگیرید که داده های مرتبط را در یک داکیومنت جاسازی (Embedding) کنید یا به آن در چندین داکیومنت ارجاع (Referencing) دهید. جاسازی می تواند به کوئری های سریعتر منجر شود، اما ارجاع دادن برای مجموعه داده های بزرگ مناسب تر است.

جاسازی Embedding:

تصور کنید که در حال ساخت یک برنامه تجارت الکترونیک هستید و دو فیلد دارید: کاربر و سفارش.

شما می توانید انتخاب کنید که جزئیات سفارش در داکیومنت کاربر جاسازی شود. این رویکرد زمانی مناسب است که سفارشات کوچک و مستقیماً به یک کاربر مرتبط باشند.

{
  "_id": ObjectId("user_id"),
  "name": "John Doe",
  "email": "john@example.com",
  "orders": [
    {
      "orderNumber": "12345",
      "totalAmount": 100.00,
      "items": [
        { "productId": ObjectId("product_id"), "quantity": 2 },
        { "productId": ObjectId("another_product_id"), "quantity": 1 }
      ]
    },
    // Other orders...
  ]
}

ارجاع دادن Referencing:

با این حال، اگر سفارش‌ها با فیلدهای زیادی پیچیده هستند و می‌خواهید بین کاربران و سفارش‌ها جدایی ایجاد کنید، می‌توانید سفارش‌ها را از داکیومنت کاربر ارجاع دهید.

داکیومنت کاربر:

{
  "_id": ObjectId("user_id"),
  "name": "John Doe",
  "email": "john@example.com"
}

داکیومنت سفارش:

{
  "_id": ObjectId("order_id"),
  "userId": ObjectId("user_id"),
  "orderNumber": "12345",
  "totalAmount": 100.00,
  "items": [
    { "productId": ObjectId("product_id"), "quantity": 2 },
    { "productId": ObjectId("another_product_id"), "quantity": 1 }
  ]
}

Normalize سازی موارد ضروری: زمانی که روابط پیچیده هستند یا نیاز به یکپارچگی وجود دارد، داده ها را نرمالایز کنید. تعادل بین جاسازی و ارجاع بر اساس نیازهای برنامه شما.


یک پلت فرم وبلاگ نویسی را در نظر بگیرید که در آن موجودیت های کاربر، پست و نظر دارید.

برای اطمینان از سازگاری و انعطاف پذیری داده ها، ممکن است انتخاب کنید که کاربران، پست ها و نظرات را جدا نگه دارید.

داکیومنت کاربر:

{
  "_id": ObjectId("user_id"),
  "name": "Alice"
}

داکیومنت پست:

{
  "_id": ObjectId("post_id"),
  "userId": ObjectId("user_id"),
  "title": "Introduction to Data Modeling",
  "content": "..."
}

داکیومنت کامنت ها:

{
  "_id": ObjectId("comment_id"),
  "postId": ObjectId("post_id"),
  "userId": ObjectId("user_id"),
  "text": "Great article!"
}

با نرمالایز سازی داده ها، اطمینان حاصل می کنید که تغییرات داده های کاربر (مانند نام کاربر) به طور مداوم در پست ها و نظرات منعکس می شود.


2. استراتژی های ایندکس سازی:
ایندکس ها به طور قابل توجهی بر عملکرد کوئری تأثیر می گذارند. از ایندکس های مناسب برای سرعت بخشیدن به کوئری ها استفاده کنید:

ایندکس های مرکب: چندین فیلد را در یک فهرست واحد برای پشتیبانی از کوئری های چند فیلدی ترکیب کنید.
تصور کنید مجموعه ای از محصولات دارید و مرتباً محصولات را بر اساس دسته بندی و محدوده قیمت آنها کوئری می کنید.


بدون ایندکس، کوئری ممکن است کند باشد زیرا MongoDB باید کل مجموعه را اسکن کند. با این حال، می‌توانید یک ایندکس ترکیبی در زمینه‌های دسته‌بندی و قیمت ایجاد کنید تا به طور قابل توجهی سرعت این کوئری را افزایش دهید.

db.products.createIndex({ category: 1, price: 1 });

با در نظر گرفتن این ایندکس ترکیبی، کوئری هایی مانند زیر از آن سود خواهند برد:

// Querying by category and price range
db.products.find({ category: "Electronics", price: { $gte: 100, $lte: 500 } });

ایندکس های پوششی: برای جلوگیری از نیاز به واکشی اطلاعات اضافی، تمام فیلدهای لازم را در یک فهرست قرار دهید.

مجموعه‌ای از سفارش‌ها را در نظر بگیرید که در آن‌ها اغلب نیاز به بازیابی شماره سفارش و مقدار کل آنها دارید. به جای واکشی داده های اضافی از داکیومنت، می توانید یک ایندکس پوشش ایجاد کنید.

db.orders.createIndex({ orderNumber: 1, totalAmount: 1 });

با استفاده از این ایندکس پوششی، تنها با استفاده از ایندکس و بدون نیاز به دسترسی به داکیومنت های واقعی، می توان کوئری زیر را برآورده کرد:

// Querying for order numbers and total amounts
db.orders.find({ orderNumber: "12345" }, { _id: 0, orderNumber: 1, totalAmount: 1 });

اجتناب از ایندکس سازی بیش از حد: ایندکس های غیر ضروری حافظه را مصرف می کنند و عملیات نوشتن را کاهش می دهند.


در حالی که ایندکس ها عملکرد کوئری را بهبود می بخشند، داشتن ایندکس های زیاد می تواند منجر به سربار غیرضروری در طول عملیات نوشتن شود و فضای ذخیره سازی بیشتری را مصرف کند.

به عنوان مثال، اگر یک مجموعه کاربران دارید، ایجاد یک فهرست در هر فیلد جداگانه ممکن است ضروری نباشد. در عوض، با دقت فهرست‌هایی را انتخاب کنید که با متداول‌ترین و مهم‌ترین الگوهای کوئری در برنامه شما همسو باشند.

// Avoid over-indexing
db.users.createIndex({ username: 1 });
db.users.createIndex({ email: 1 });
// ... Avoid creating indexes for every single field

در این مورد، ممکن است به جای ایندکس کردن هر فیلد در مجموعه، فهرست‌هایی را در فیلدهایی ایجاد کنید که اغلب برای جستجو یا فیلتر کردن استفاده می‌شوند.

 

-دیتابیس های NoSQL در مقابل SQL

-داکر چیست؟

-پست من چیست؟


3. بهینه سازی عملکرد کوئری:

کوئریهای کارآمد کلید یک برنامه پاسخگو هستند. این شیوه ها را دنبال کنید:

از چارچوب تجمعی استفاده کنید: برای دستکاری داده های پیچیده، از چارچوب تجمیع قدرتمند MongoDB استفاده کنید.
فرض کنید یک برنامه تجارت الکترونیک با مجموعه محصولات دارید و می خواهید میانگین قیمت محصولات را در یک دسته خاص محاسبه کنید.

به جای بازیابی همه محصولات در آن دسته و انجام محاسبات در کد برنامه خود، می توانید از چارچوب تجمیع برای محاسبه مستقیم قیمت متوسط ​​در دیتابیس استفاده کنید:

db.products.aggregate([
  { $match: { category: "Electronics" } }, // Filter products in the desired category
  { $group: { _id: null, avgPrice: { $avg: "$price" } } } // Calculate the average price
]);

محدود کردن و پرش با احتیاط: از استفاده بیش از حد از عملیات پرش و محدود کردن خودداری کنید، زیرا ممکن است در مجموعه داده‌های بزرگ کند باشند.


یک پلت فرم وبلاگ را در نظر بگیرید که در آن می خواهید صفحه بندی را برای فهرست کردن پست های وبلاگ پیاده سازی کنید. در حالی که می توان از محدودیت و پرش برای صفحه بندی استفاده کرد، استفاده بیش از حد می تواند در مجموعه داده های بزرگ کند باشد

// Retrieve the first 10 blog posts for the second page
db.posts.find().limit(10).skip(10); // Avoid excessive skip operations

برای صفحه بندی کارآمد، از یک رویکرد مبتنی بر cursor-based با یک فیلد منحصر به فرد مانند id_ استفاده کنید:

// Retrieve 10 blog posts after a specific _id
db.posts.find({ _id: { $gt: lastId } }).limit(10);

از Projection استفاده کنید: فقط فیلدهای ضروری را برای کاهش انتقال داده و افزایش سرعت جستجوها بازیابی کنید.


تصور کنید در حال ساخت داشبوردی هستید که فقط نام و آدرس ایمیل کاربران را نمایش می دهد.

به جای بازیابی کل داکیومنت ها کاربر، می توانید از طرح ریزی برای بازیابی فقط فیلدهای ضروری استفاده کنید که انتقال داده ها را کاهش داده و عملکرد کوئری را بهبود می بخشد:

// Retrieve only the names and email addresses of users
db.users.find({}, { _id: 0, name: 1, email: 1 });

با مشخص کردن { id: 0, name: 1, email: 1_ }، نشان می‌دهید که فقط نام و فیلدهای ایمیل باید در نتیجه بازگردانده شوند.

4. مقیاس بندی و تقسیم بندی:

مقیاس پذیری افقی MongoDB یکی از نقاط قوت آن است. با شاردینگ برای رشد آینده برنامه ریزی کنید:

یک کلید Sharding را با دقت انتخاب کنید: کلید اشتراک گذاری بر نحوه توزیع داده ها در بین شارد ها تأثیر می گذارد. کلیدی را انتخاب کنید که داده ها را به طور یکنواخت توزیع می کند و از هات اسپات جلوگیری می کند.


فرض کنید در حال ساختن یک پلتفرم رسانه اجتماعی هستید و می‌خواهید مجموعه پست‌ها را برای توزیع داده‌ها در چند شارد تقسیم کنید. یک کلید اشتراک گذاری مناسب، فیلد userId است، زیرا به طور مساوی توزیع شده و به الگوی کوئری مرتبط است.

// Enable sharding on the database
sh.enableSharding("social_media_db");

// Shard the Posts collection using the userId field as the sharding key
sh.shardCollection("social_media_db.Posts", { "userId": 1 });

با اشتراک گذاری بر اساس userId، داده های هر کاربر در بین شارد ها توزیع می شود و توزیع متعادل داده ها را تضمین می کند و از هات اسپات جلوگیری می کند.


نظارت بر تعادل شارد ها: با رشد داده‌ها، مراقب توزیع و تعادل خرده‌ها باشید تا از عملکرد یکنواخت اطمینان حاصل کنید. 


همانطور که داده های شما رشد می کند، مهم است که مراقب توزیع و تعادل شارد ها باشید تا عملکرد یکنواخت را حفظ کنید. متعادل کننده داخلی MongoDB اطمینان حاصل می کند که داده ها به طور مساوی در بین شارد ها توزیع می شوند.


با استفاده از دستورات زیر می‌توانید وضعیت تعادل قطعه را بررسی کنید:

// Check the status of the balancer
sh.getBalancerState();

// View information about chunks and their distribution
sh.status();

اگر حالت متعادل کننده روشن باشد و توزیع تکه ناهموار باشد، متعادل کننده MongoDB به طور خودکار تکه ها را بین خرده ها منتقل می کند تا بار را متعادل کند. نظارت بر این حالت ها و اجرای دوره ای این دستورات می تواند به اطمینان از عملکرد یکنواخت در بین شارد ها کمک کند.

با انتخاب دقیق کلید اشتراک‌گذاری و نظارت فعال بر توزیع خرده‌ها، می‌توانید به طور موثر مقیاس‌پذیری افقی MongoDB را برای تطبیق داده‌های در حال رشد و در عین حال حفظ عملکرد بهینه، مهار کنید.

5. اطمینان از در دسترس بودن بالا:

MongoDB ویژگی هایی را برای اطمینان از در دسترس بودن داده ها حتی در صورت خرابی ارائه می دهد:

Replica Sets: از مجموعه replica برای نگهداری چندین نسخه از داده ها در سرورهای مختلف استفاده کنید. این افزونگی و شکست خودکار را فراهم می کند.


یک مجموعه کپی از چندین نمونه MongoDB تشکیل شده است که داده های یکسانی را میزبانی می کنند و در صورت خرابی گره اولیه، افزونگی و خطای خودکار را تضمین می کنند.

راه اندازی یک مجموعه کپی:

فرض کنید در حال راه اندازی یک replica set برای دیتابیس MyApp خود هستید. شما باید چندین نمونه را شروع کنید، آنها را به عنوان اعضای مجموعه replica پیکربندی کنید و مجموعه را راه اندازی کنید.

// Start three MongoDB instances on different ports
mongod --port 27017 --dbpath /data/rs1
mongod --port 27018 --dbpath /data/rs2
mongod --port 27019 --dbpath /data/rs3

// Connect to one instance and initiate the replica set
mongo --port 27017
rs.initiate({
  _id: "MyAppReplicaSet",
  members: [
    { _id: 0, host: "localhost:27017" },
    { _id: 1, host: "localhost:27018" },
    { _id: 2, host: "localhost:27019" }
  ]
});

پس از راه اندازی مجموعه replica، MongoDB به طور خودکار یک گره اولیه را انتخاب می کند و گره های ثانویه را که داده ها را از اولیه تکرار می کنند حفظ می کند. اگر گره اولیه از کار بیفتد، یکی از ثانویه ها به عنوان اصلی جدید انتخاب می شود و در دسترس بودن بالا را تضمین می کند.

Concern خواندن و نوشتن: Concern های خواندن و نوشتن مناسب را بر اساس سطح سازگاری داده مورد نیاز انتخاب کنید. 
تنظیمات نگرانی خواندن و نوشتن به شما این امکان را می دهد که سطح سازگاری و دوام داده را برای عملیات خواندن و نوشتن کنترل کنید.

نمونه ای از Concern خواندن:

فرض کنید می خواهید عملیات خواندن را انجام دهید و مطمئن شوید که به روزترین داده ها را دریافت می کنید.

// Read concern "majority" ensures that the read operation reflects the majority of data
db.collection.find({}).readConcern("majority");

مثالی از Concern نوشتن:

برای عملیات نوشتن حیاتی، ممکن است بخواهید قبل از در نظر گرفتن موفقیت آمیز نوشتن، اطمینان حاصل کنید که داده ها به طور ایمن برای اکثر اعضای مجموعه replica نوشته شده است.

// Write concern "majority" ensures that the write is acknowledged by the majority of nodes
db.collection.insertOne({ data: "example" }, { writeConcern: { w: "majority" } });

با استفاده از تنظیمات مربوط به خواندن و نوشتن مناسب، می توانید مبادله بین سازگاری داده ها و عملکرد را کنترل کنید و اطمینان حاصل کنید که برنامه شما نیازهای در دسترس بودن و دوام آن را برآورده می کند.


پیاده‌سازی مجموعه‌های replica و درک تنظیمات مربوط به خواندن و نوشتن، گام‌های مهمی برای اطمینان از دسترسی بالا و یکپارچگی داده در استقرار MongoDB شما هستند.

نتیجه

با پیروی از بهترین روش های MongoDB، می توانید عملکرد، مقیاس پذیری و قابلیت اطمینان برنامه های خود را بهینه کنید. از مدل‌سازی کارآمد داده‌ها گرفته تا فهرست‌بندی و مقیاس‌بندی مناسب، این دستورالعمل‌ها به شما کمک می‌کنند تا برنامه‌هایی بسازید که از نقاط قوت MongoDB و در عین حال کاهش مشکلات احتمالی استفاده کنید. به یاد داشته باشید که هر برنامه منحصر به فرد است، بنابراین این روش ها را متناسب با نیازهای خاص و نیازهای پروژه خود تنظیم کنید.

#mongodb#nosql#database#best_practice#nodejs
نظرات ارزشمند شما :

در حال دریافت...

مقاله های مشابه

در حال دریافت...