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

چند روش مختلف برای بهبود عملکرد 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 از SDK های بومی برای پلتفرم برنامه خود استفاده کنید. SDK ها اتصالات باز را حفظ می کنند و هزینه های رمزگذاری SSL و بار پایگاه داده را که می تواند با REST API اضافه شود، کاهش می دهند.

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

داده‌ها را در چندین پایگاه داده خرد کنید

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

پرسمان‌های فهرست

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

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

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

افزایش کارایی شنونده

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

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

مطمئن شوید که شنونده‌ها را به صورت پویا اضافه می‌کنید و وقتی دیگر نیازی به آنها ندارید، آنها را حذف می‌کنید.

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

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

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

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