بهینه‌سازی عملکرد پایگاه داده

چند روش مختلف برای بهبود عملکرد Firebase Realtime Database در برنامه‌تان وجود دارد. برای اینکه بدانید چه کاری می‌توانید برای بهینه‌سازی عملکرد Realtime Database انجام دهید، داده‌ها را ازطریق ابزارهای مختلف نظارت بر Realtime Database جمع‌آوری کنید، سپس تغییرات را در برنامه یا استفاده از Realtime Database اعمال کنید.

پایش عملکرد Realtime Database

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

  • نمای کلی سطح بالا: از ابزار نمایه‌ساز برای دریافت فهرست پُرسمان‌های نمایه‌نشده و نمای کلی هم‌زمان از عملیات خواندن/نوشتن استفاده کنید.
  • برآورد استفاده صورت‌حساب‌شده: از سنجه‌های استفاده موجود در کنسول Firebase استفاده کنید تا استفاده صورت‌حساب‌شده و سنجه‌های عملکرد سطح بالا را ببینید.
  • جزئیات دقیق: از Cloud Monitoring برای بررسی دقیق‌تر عملکرد پایگاه داده‌تان درطول زمان استفاده کنید.

بهبود عملکرد براساس سنجه

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

استراتژی‌های بهبود عملکرد در یک نگاه
سنجه شرح روال‌های مطلوب
بار/استفاده بهینه‌سازی کنید که چه مقدار از ظرفیت پایگاه داده شما درحال استفاده برای پردازش درخواست‌ها در هر زمان مشخص است (در سنجه‌های **بار** یا **io/database_load** منعکس می‌شود). بهینه‌سازی ساختار داده
تکه‌تکه کردن داده‌ها در پایگاه‌های داده
بهبود کارایی شنونده
محدود کردن بارگیری‌ها با قوانین مبتنی بر پُرسمان
بهینه‌سازی اتصالات
اتصال‌های فعال تعداد اتصالات هم‌زمان و فعال به پایگاه داده‌تان را متعادل کنید تا زیر حد مجاز ۲۰۰٬۰۰۰ اتصال باقی بماند. تکه‌تکه کردن داده‌ها در پایگاه‌های داده
کاهش اتصالات جدید
پهنای باند خروجی اگر بارگیری‌ها از پایگاه داده‌تان بیشتر از حد موردنظرتان است، می‌توانید کارایی عملیات خواندن را بهبود دهید و سربار رمزگذاری را کاهش دهید. بهینه‌سازی اتصالات
بهینه‌سازی ساختار داده‌ها
محدود کردن بارگیری‌ها با قوانین مبتنی بر پُرسمان
استفاده مجدد از جلسه‌های SSL
بهبود کارایی شنونده
محدود کردن دسترسی به داده‌ها
فضای ذخیره‌سازی مطمئن شوید که داده‌های استفاده‌نشده را ذخیره نمی‌کنید، یا داده‌های ذخیره‌شده‌تان را در پایگاه‌های داده دیگر و/یا محصولات Firebase توازن دهید تا زیر سهمیه باقی بمانید. پاک‌سازی داده‌های استفاده‌نشده
بهینه‌سازی ساختار داده‌ها
تکه‌تکه کردن داده‌ها در پایگاه‌های داده
استفاده از Cloud Storage for Firebase

بهینه‌سازی اتصالات

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

هرزمان ممکن بود، به‌جای REST API، از کیت‌های توسعه نرم‌افزار بومی برای پلاتفرم برنامه‌تان استفاده کنید. کیت‌های توسعه نرم‌افزار اتصال‌های باز را حفظ می‌کنند و هزینه‌های رمزگذاری SSL و بار پایگاه داده را که می‌تواند با REST API افزایش یابد کاهش می‌دهند.

اگر از REST API استفاده می‌کنید، برای حفظ اتصال باز، از HTTP keep-alive استفاده کنید یا از رویدادهای ارسال‌شده از سرور استفاده کنید، که می‌تواند هزینه‌های ناشی‌از دست‌دهی SSL را کاهش دهد.

داده‌های Shard در چندین پایگاه داده

تقسیم داده‌ها در چندین نمونه Realtime Database، که به آن بخش‌بندی پایگاه داده نیز می‌گویند، سه مزیت دارد:

  1. با تقسیم کردن اتصال‌های فعال هم‌زمان در نمونه‌های پایگاه داده، تعداد کل این اتصال‌ها را که در برنامه‌تان مجاز است افزایش دهید.
  2. توازن بار در نمونه‌های پایگاه داده.
  3. اگر گروه‌های مستقلی از کاربران دارید که فقط به مجموعه‌های داده مجزا نیاز دارند، از نمونه‌های پایگاه داده مختلف برای توان عملیاتی بالاتر و تأخیر کمتر استفاده کنید.

اگر از طرح قیمت‌گذاری Blaze استفاده می‌کنید، می‌توانید چندین نمونه پایگاه داده در یک پروژه Firebase ایجاد کنید و از یک روش اصالت‌سنجی کاربر مشترک در نمونه‌های پایگاه داده بهره ببرید.

درباره نحوه و زمان تکه‌تکه کردن داده‌ها بیشتر بدانید.

ساختن ساختارهای داده کارآمد

چون Realtime Database داده‌ها را از گره‌های فرزند مسیر و همچنین خود مسیر بازیابی می‌کند، منطقی است که ساختار داده‌هایتان را تا حد امکان مسطح نگه دارید. به‌این‌ترتیب، می‌توانید داده‌های موردنیازتان را به‌صورت انتخابی بازیابی کنید، بدون اینکه داده‌های غیرضروری را نیز در کارخواه‌ها بارگیری کنید.

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

علاوه‌براین، هر نوشتن می‌تواند ۰٫۱٪ از کل استفاده از پایگاه داده شما را به خود اختصاص دهد. داده‌هایتان را به‌گونه‌ای ساختاربندی کنید که بتوانید نوشتن‌ها را به‌صورت دسته‌ای در یک عملیات واحد به‌عنوان به‌روزرسانی‌های چندمسیره ازطریق روش‌های update() در کیت‌های توسعه نرم‌افزار یا درخواست‌های PATCH RESTful انجام دهید.

برای بهینه‌سازی ساختار داده‌ها و بهبود عملکرد، روال‌های مطلوب برای ساختار داده‌ها را دنبال کنید.

جلوگیری از دسترسی غیرمجاز

با Realtime Database Security Rules از عملیات غیرمجاز در پایگاه داده‌تان جلوگیری کنید. برای مثال، استفاده از قوانین می‌تواند از سناریویی که در آن کاربر مخرب به‌طور مکرر کل پایگاه داده شما را بارگیری می‌کند جلوگیری کند.

درباره استفاده از «قوانین پایگاه داده بی‌درنگ Firebase» بیشتر بدانید.

استفاده از قوانین مبتنی بر پُرسمان برای محدود کردن بارگیری‌ها

Realtime Database Security Rules دسترسی به داده‌ها را در پایگاه داده شما محدود می‌کند، اما می‌تواند به‌عنوان محدودیت‌هایی برای داده‌های برگردانده‌شده ازطریق عملیات خواندن نیز عمل کند. وقتی‌که از قوانین مبتنی بر پُرسمان استفاده می‌کنید، همان‌طور که با عبارت‌های query. مانند query.limitToFirst تعریف شده است، پُرسمان‌ها فقط داده‌های محدودشده توسط قانون را بازیابی می‌کنند.

برای مثال، قانون زیر دسترسی خواندن را فقط به ۱۰۰۰ نتیجه اول پُرسمان محدود می‌کند، که براساس اولویت مرتب شده‌اند:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

درباره Realtime Database Security Rules بیشتر بدانید.

پُرسمان‌های نمایه

نمایه‌سازی داده‌هایتان کل پهنای باندی را که برای هر پُرسمان اجراشده توسط برنامه‌تان استفاده می‌کنید کاهش می‌دهد.

استفاده مجدد از جلسه‌های SSL

با صدور بلیت‌های جلسه TLS، هزینه‌های سربار رمزگذاری SSL را در اتصال‌های ازسرگرفته‌شده کاهش دهید. این ویژگی به‌ویژه زمانی مفید است که به اتصال‌های مکرر و امن به پایگاه داده نیاز دارید.

بهبود کارایی شنونده

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

برای محدود کردن داده‌هایی که عملیات گوش دادن شما برمی‌گرداند، پُرسمان اضافه کنید و از شنوندگانی استفاده کنید که فقط به‌روزرسانی‌های داده را بارگیری می‌کنند — برای مثال، on() به‌جای once(). .once() را برای کنش‌هایی رزرو کنید که واقعاً به به‌روزرسانی داده نیاز ندارند. علاوه‌براین، برای بهترین عملکرد، هر زمان که ممکن بود پُرسمان‌هایتان را بااستفاده از orderByKey() مرتب کنید. مرتب‌سازی با orderByChild() می‌تواند ۶ تا ۸ برابر کندتر باشد، و مرتب‌سازی با orderByValue() می‌تواند برای مجموعه‌های بزرگ داده بسیار کند باشد، زیرا نیاز به خواندن کل مکان از لایه پایداری دارد.

حتماً شنوندگان را به‌صورت پویا اضافه کنید و وقتی دیگر لازم نبودند آن‌ها را بردارید.

پاک‌سازی داده‌های بدون استفاده

به‌طور دوره‌ای، داده‌های استفاده‌نشده یا تکراری را از پایگاه داده‌تان بردارید. می‌توانید پشتیبان‌گیری‌ها را اجرا کنید تا داده‌هایتان را به‌صورت دستی بازرسی کنید یا به‌طور دوره‌ای از آن در یک دسته Google Cloud Storage پشتیبان‌گیری کنید. همچنین میزبانی داده‌های ذخیره‌شده ازطریق Cloud Storage for Firebase را درنظر بگیرید.

کد مقیاس‌پذیری را که می‌توانید به‌روز کنید ارسال کنید

برنامه‌هایی که در دستگاه‌های «اینترنت اشیاء» ساخته می‌شوند باید حاوی کد مقیاس‌پذیری باشند که بتوانید به‌راحتی به‌روز کنید. حتماً موارد استفاده را به‌طور کامل آزمایش کنید، سناریوهایی را که ممکن است پایگاه کاربرتان به‌طور تصاعدی رشد کند درنظر بگیرید، و توانایی استقرار به‌روزرسانی‌ها را در کدتان ایجاد کنید. تغییرات عمده‌ای را که ممکن است در آینده نیاز به اعمال آن‌ها داشته باشید به‌دقت درنظر بگیرید، مثلاً اگر تصمیم بگیرید داده‌هایتان را قطعه‌بندی کنید.