تحسين أداء قاعدة البيانات

هناك عدة طرق مختلفة لتحسين Firebase Realtime Database الأداء في تطبيقك. لمعرفة ما يمكنك فعله لتحسين Realtime Database الأداء، اجمَع البيانات من خلال أدوات Realtime Database الرصد المختلفة، ثم أجرِ تغييرات على تطبيقك أو على طريقة Realtime Database استخدامك وفقًا لذلك.

مراقبة أداء Realtime Database

يمكنك جمع بيانات عن أداء Realtime Database's من خلال عدة أدوات مختلفة، استنادًا إلى مستوى التفاصيل الذي تحتاجه:

  • نظرة عامة عالية المستوى: استخدِم أداة تحديد المشاكل للحصول على قائمة بطلبات البحث غير المفهرسة ونظرة عامة في الوقت الفعلي على عمليات القراءة والكتابة
  • تقدير الاستخدام الذي يتم تحصيل رسومه: استخدِم مقاييس الاستخدام المتاحة في Firebase Console للاطّلاع على الاستخدام الذي يتم تحصيل رسومه ومقاييس الأداء عالية المستوى.
  • تحليل تفصيلي: استخدِم Cloud Monitoring للحصول على نظرة أكثر تفصيلاً على أداء قاعدة البيانات بمرور الوقت.

تحسين الأداء حسب المقياس

بعد جمع البيانات، استكشِف أفضل الممارسات والاستراتيجيات التالية استنادًا إلى جانب الأداء الذي تريد تحسينه.

نظرة سريعة على استراتيجيات تحسين الأداء
المقياس الوصف أفضل الممارسات
التحميل/الاستخدام حسِّن مقدار سعة قاعدة البيانات المستخدَمة لمعالجة الطلبات في أي وقت معيّن (يظهر ذلك في مقياسَي **التحميل** أو **io/database_load**). تحسين بنية البيانات
تقسيم البيانات بين قواعد البيانات
تحسين كفاءة المستمع
الحدّ من عمليات التنزيل باستخدام القواعد المستندة إلى طلبات البحث
تحسين الاتصالات
الاتصالات النشطة وازِن عدد الاتصالات النشطة المتزامنة بقاعدة البيانات لكي لا يتجاوز الحدّ الأقصى المسموح به وهو 200,000 اتصال. تقسيم البيانات بين قواعد البيانات
تقليل الاتصالات الجديدة
معدل نقل البيانات الصادرة إذا كانت عمليات التنزيل من قاعدة البيانات تبدو أعلى مما تريد، يمكنك تحسين كفاءة عمليات القراءة وتقليل تكاليف التشفير. تحسين الاتصالات
تحسين بنية البيانات
الحدّ من عمليات التنزيل باستخدام القواعد المستندة إلى طلبات البحث
إعادة استخدام جلسات طبقة المقابس الآمنة (SSL)
تحسين كفاءة المستمع
حظر الوصول إلى البيانات
التخزين تأكَّد من أنّك لا تخزِّن بيانات غير مستخدَمة، أو وازِن بين البيانات المخزَّنة في قواعد بيانات أخرى و/أو منتجات Firebase الأخرى لكي لا تتجاوز الحصة المخصّصة. تنظيف البيانات غير المستخدَمة
تحسين بنية البيانات
تقسيم البيانات بين قواعد البيانات
استخدام Cloud Storage for Firebase

تحسين الاتصالات

لا تزال الطلبات المستندة إلى REST، مثل GET وPUT، تتطلّب اتصالاً، حتى لو كان هذا الاتصال قصير الأمد. يمكن أن تؤدي هذه الاتصالات المتكررة قصيرة الأمد إلى زيادة تكاليف الاتصال وحِمل قاعدة البيانات ومعدّل نقل البيانات الصادرة بشكل كبير مقارنةً بالاتصالات النشطة في الوقت الفعلي بقاعدة البيانات.

استخدِم حِزم SDK الأصلية للنظام الأساسي لتطبيقك بدلاً من REST API كلما أمكن ذلك. تحافظ حِزم SDK على الاتصالات المفتوحة، ما يقلّل من تكاليف تشفير طبقة المقابس الآمنة (SSL) وحِمل قاعدة البيانات اللذين يمكن أن يتراكمَا عند استخدام REST API.

إذا كنت تستخدِم REST API، ننصحك باستخدام HTTP keep-alive للحفاظ على اتصال مفتوح أو استخدام الأحداث التي يرسلها الخادم، ما يمكن أن يقلّل من التكاليف الناتجة عن عمليات تأكيد الاتصال عبر طبقة المقابس الآمنة (SSL).

تقسيم البيانات بين قواعد بيانات متعددة

يؤدي تقسيم بياناتك بين عدة مثيلات من Realtime Database، المعروف أيضًا باسم تقسيم قاعدة البيانات، إلى تحقيق ثلاث مزايا:

  1. زيادة إجمالي عدد الاتصالات النشطة المتزامنة المسموح بها في تطبيقك من خلال تقسيمها بين مثيلات قاعدة البيانات
  2. موازنة الحِمل بين مثيلات قاعدة البيانات
  3. إذا كان لديك مجموعات مستقلة من المستخدِمين لا يحتاجون إلا إلى الوصول إلى مجموعات بيانات منفصلة، استخدِم مثيلات مختلفة من قاعدة البيانات للحصول على معدّل نقل بيانات أعلى ووقت استجابة أقل.

إذا كنت تستخدِم خطة Blaze، يمكنك إنشاء عدة مثيلات من قاعدة البيانات ضمن مشروع Firebase نفسه، مع الاستفادة من طريقة شائعة لمصادقة المستخدِمين في جميع مثيلات قاعدة البيانات.

مزيد من المعلومات عن كيفية تقسيم البيانات ومتى يجب ذلك .

إنشاء بُنى بيانات فعّالة

بما أنّ Realtime Database تسترد البيانات من العُقد الفرعية للمسار بالإضافة إلى المسار نفسه، من المنطقي أن تحافظ على بنية البيانات مسطّحة قدر الإمكان. بهذه الطريقة، يمكنك استرداد البيانات التي تحتاج إليها بشكل انتقائي، بدون تنزيل بيانات غير ضرورية أيضًا على الأجهزة.

على وجه الخصوص، ضَع في اعتبارك عمليات الكتابة والحذف عند تنظيم بياناتك. على سبيل المثال، قد يكون حذف المسارات التي تحتوي على آلاف العُقد الطرفية مكلفًا. يمكن أن يؤدي تقسيمها إلى مسارات تحتوي على عدة أشجار فرعية وعدد أقل من العُقد الطرفية لكل عُقدة إلى تسريع عمليات الحذف.

بالإضافة إلى ذلك، يمكن أن تستغرق كل عملية كتابة% 0.1 من إجمالي استخدام قاعدة البيانات. نظِّم بياناتك بطريقة تسمح لك بتجميع عمليات الكتابة في عملية واحدة كعمليات تعديل متعددة المسارات من خلال طُرق update() في حِزم SDK أو طلبات PATCH المستندة إلى REST.

لتحسين بنية البيانات وتحسين الأداء، اتّبِع الـ ممارسات الأفضل لبُنى البيانات.

منع الوصول غير المصرَّح به

امنع العمليات غير المصرَّح بها على قاعدة البيانات باستخدام Realtime Database Security Rules. على سبيل المثال، يمكن أن يؤدي استخدام القواعد إلى تجنُّب سيناريو ينزِّل فيه مستخدِم ضار قاعدة البيانات بأكملها بشكل متكرر.

مزيد من المعلومات عن استخدام قواعد قاعدة بيانات Firebase في الوقت الفعلي.

استخدام القواعد المستندة إلى طلبات البحث للحدّ من عمليات التنزيل

Realtime Database Security Rules تحظر الوصول إلى البيانات في قاعدة البيانات، ولكن يمكن أن تكون أيضًا بمثابة حدود للبيانات التي يتم عرضها من خلال عمليات القراءة. عند استخدام القواعد المستندة إلى طلبات البحث، كما هو محدّد من خلال تعبيرات query. مثل query.limitToFirst، لا تسترد طلبات البحث إلا البيانات التي تحدّدها القاعدة.

على سبيل المثال، تحظر القاعدة التالية إذن القراءة على أول 1000 نتيجة فقط من طلب بحث، مرتّبة حسب الأولوية:

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

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

مزيد من المعلومات عن Realtime Database Security Rules

فهرسة طلبات البحث

يؤدي فهرسة بياناتك إلى تقليل إجمالي معدّل نقل البيانات الذي تستخدمه لكل طلب بحث يُشغّله تطبيقك.

إعادة استخدام جلسات طبقة المقابس الآمنة (SSL)

قلِّل تكاليف تشفير طبقة المقابس الآمنة (SSL) على الاتصالات التي تم استئنافها من خلال إصدار تذاكر جلسات طبقة النقل الآمنة (TLS). يكون ذلك مفيدًا بشكل خاص إذا كنت تحتاج إلى اتصالات آمنة ومتكررة بقاعدة البيانات.

تحسين كفاءة المستمع

ضَع المستمعين في أدنى مستوى ممكن من المسار للحدّ من مقدار البيانات التي يزامِنونها. يجب أن يكون المستمعون قريبين من البيانات التي تريد أن يحصلوا عليها. لا تستمع إلى جذر قاعدة البيانات، لأنّ ذلك يؤدي إلى تنزيل قاعدة البيانات بأكملها.

أضِف طلبات بحث للحدّ من البيانات التي تعرضها عمليات الاستماع واستخدِم المستمعين الذين لا ينزِّلون سوى التعديلات على البيانات، على سبيل المثال، on() بدلاً من once(). استخدِم .once() للإجراءات التي لا تتطلّب تعديلات على البيانات. بالإضافة إلى ذلك، رتِّب طلبات البحث باستخدام orderByKey() كلما أمكن ذلك للحصول على أفضل أداء. يمكن أن يكون الترتيب باستخدام orderByChild() أبطأ من 6 إلى 8 مرات، ويمكن أن يكون الترتيب باستخدام orderByValue() بطيئًا جدًا لمجموعات البيانات الكبيرة، لأنّه يتطلّب قراءة الموقع بأكمله من طبقة الثبات.

احرِص أيضًا على إضافة المستمعين ديناميكيًا وإزالتهم عندما لا يعودون ضروريين.

تنظيف البيانات غير المستخدَمة

أزِل بشكل دوري أي بيانات غير مستخدَمة أو مكرّرة في قاعدة البيانات. يمكنك إجراء عمليات احتياطية لفحص بياناتك يدويًا أو الاحتفاظ بنسخة احتياطية منها بشكل دوري في مجموعة Google Cloud Storage تخزين. ننصحك أيضًا باستضافة البيانات المخزَّنة من خلال Cloud Storage for Firebase.

إنشاء رمز قابل للتوسّع يمكنك تعديله

يجب أن تتضمّن التطبيقات المضمّنة في أجهزة إنترنت الأشياء رمزًا قابلاً للتوسّع يمكنك تعديله بسهولة. احرِص على اختبار حالات الاستخدام بدقة، وضَع في اعتبارك السيناريوهات التي قد تؤدي إلى زيادة قاعدة المستخدِمين بشكل كبير، وأضِف إمكانية نشر التعديلات على الرمز. ضَع في اعتبارك بعناية التغييرات الرئيسية التي قد تحتاج إلى إجراؤها لاحقًا، على سبيل المثال، إذا قرّرت تقسيم بياناتك.