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

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

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

يمكنك جمع بيانات حول أداء Realtime Database من خلال بعض الأدوات المختلفة، وذلك حسب مستوى الدقة الذي تحتاجه:

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

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

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

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

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

تتطلّب طلبات RESTful، مثل 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 RESTful.

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

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

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

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

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

Realtime Database Security Rules restrict access to data in your database, but they can also serve as limits on data returned through read operations. عند استخدام القواعد المستندة إلى طلبات البحث، كما هو محدّد في تعبيرات 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.

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

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