سؤال

لذلك لقد قمت ببناء تطبيقات Django لفترة من الوقت الآن، وشرب المساعدات الباردة وكلها: فقط باستخدام ORM وكتابة مخصص مخصص SQL.

كانت الصفحة الرئيسية للموقع (الواجهة الأساسية حيث سيقض المستخدمون حيث سيقض المستخدمون 80٪ - 90٪ من وقتهم) بمجرد أن يكون لديك كمية كبيرة من المحتوى الخاص بالمستخدم (أي الصور والأصدقاء والبيانات الأخرى وغيرها)

لذلك برزت في مسجل SQL (تم تثبيته مسبقا مع Pinax، لقد قمت للتو بتمكينه في الإعدادات) وتخيل مفاجئتي عند الإبلاغ عنها 500 استعلامات قاعدة البيانات! مع Hand Coded SQL، بالكاد ركض أكثر من 50 في الصفحات الأكثر تعقيدا.

في الفينتان، ليس كل شيء مفاجئا، لكن يبدو أن هذا لا يمكن أن يكون جيدا.

... حتى لو كان فقط عشرات أو نحو ذلك من الاستعلامات تأخذ 1ms +

لذلك أنا أتساءل، ما مقدار النفقات العامة هناك في رحلة ذهابا وإيابا إلى MySQLب django و mysql تعمل على نفس الخادم لذلك لا ينبغي أن يكون هناك أي شبكة ذات صلة بالشبكات.

هل كانت مفيدة؟

المحلول

هناك بعض الطرق لتقليل حجم الاستعلام.

  1. يستخدم .filter() و .all() للحصول على مجموعة من الأشياء؛ اختيار واختيار في وظيفة العرض (أو القالب عبر {%if%}). يمكن لبثون معالجة دفعة من الصفوف بشكل أسرع من MySQL.

    "ولكن يمكنني إرسال الكثير إلى القالب". صحيح، لكنك ستنفذ طلبات SQL أقل. التدبير لمعرفة أيهما أفضل.

    هذا هو ما اعتدت فعله عند كتابة SQL. ليس من الخطأ - فهو لا ينكسر Orm - لكنه يحسن عمل DB الأساسي ويضع المعالجة في وظيفة العرض والقالب.

  2. تجنب الملاحة الاستعلام في القالب. عند القيام {{foo.bar.baz.quux}}، يتم استخدام SQL للحصول على bar مرتبط ب foo, ، ثم baz المرتبطة bar, ، ثم quux مرتبط ب baz. وبعد قد تكون قادرا على تقليل عملية الاستعلام هذه مع بعض الحذر .filter() و Python معالجة لتجميع Tuple مفيدة في وظيفة العرض.

    مرة أخرى، كان هذا شيئا اعتدته القيام به عند يدويا SQL. في هذه الحالة، تقوم بجمع دفعات أكبر من الكائنات المدارة في Orm في وظيفة العرض وقم بتصفيتك في Python بدلا من الكثير من طلبات Orm الفردية.

    هذا لا يكسر orm. يغير ملف تعريف الاستخدام من الكثير من الاستفسارات الصغيرة إلى عدد قليل من الاستفسارات الكبيرة.

نصائح أخرى

فقط لأنك تستخدم Orm لا يعني أنك يجب أن لا تقوم بضبط الأداء.

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

يمكنك أيضا تشغيل Profiler SQL ومعرفة ما إذا كانت هناك مؤشرات من شأنها مساعدة استعلاماتك الأكثر شيوعا - كما تعلمون، أشياء قاعدة البيانات القياسية.

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

إذا فشل كل شيء آخر، تذكر: Orm رائع، ونعم - يجب أن تحاول استخدامه لأنه فلسفة Django؛ لكنك غير متزوج.

إذا كان لديك حقا USECASE حيث لم تساعد الدراسة وضبط التنقل في Orm، إذا كنت متأكدا من أنك تستطيع أن تفعل ذلك أفضل بكثير مع استعلام قياسي: استخدم SQL RAW SQL لهذه الحالة.

النفقات العامة لكل استفسارات ليست سوى جزء من الصورة. ربما تكون وقت الرحلة الفعلي بين خوادم Django و MySQL صغيرة جدا لأن معظم استفساراتك تعود في أقل من مللي ثانية واحدة. المشكلة الأكبر هي أن عدد الاستعلامات الصادر إلى قاعدة البيانات الخاصة بك يمكن أن يغلب عليه بسرعة. 500 استعلامات للصفحة هي وسيلة إلى حد كبير، حتى 50 يبدو وكأنه الكثير بالنسبة لي. إذا عرض عشرة مستخدمين صفحات معقدة، فأنت الآن ما يصل إلى 5000 استعلامات.

يعد وقت الرحلة المستديرة إلى خادم قاعدة البيانات أكثر من عاملا عندما يقوم المتصل بالوصول إلى قاعدة البيانات من شبكة واسعة، حيث يمكن أن تكون Roundtrips بسهولة بين 20ms و 100ms.

بالتأكيد أود أن أنظر في استخدام نوع من التخزين المؤقت.

هناك دائما النفقات العامة في مكالمات قاعدة البيانات، في حالتك العامة ليست كذلك الذي - التي سيئة لأن التطبيق وقاعدة البيانات على نفس الجهاز لذلك لا يوجد كونسية شبكة ولكن لا تزال هناك تكلفة كبيرة.

عند تقديم طلب إلى قاعدة البيانات، يجب أن تحضير للخدمة التي تطلب من خلال القيام بعدد من الأشياء بما في ذلك:

  • تخصيص الموارد (المخازن المؤقتة للذاكرة، جداول TEMP، إلخ) إلى اتصال خادم قاعدة البيانات / مؤشر الترابط الذي سيؤدي إلى التعامل مع الطلب،
  • إزالة SQL والمعلمات (هذا ضروري حتى على جهاز واحد لأن هذا هو طلب مشترك بين المعالجة إلا إذا كنت تستخدم قاعدة بيانات متضمنة)
  • التحقق مما إذا كان الاستعلام موجود في ذاكرة التخزين المؤقت للاستعلام إذا لم يكن تحسينه ووضعه في ذاكرة التخزين المؤقت.
    • ملاحظة أيضا أنه إذا لم يتم تحديد استفساراتك (هذه هي القيم غير مفصلة عن SQL) قد يؤدي ذلك إلى تفويت ذاكرة التخزين المؤقت للبيانات التي يجب أن تكون هي نفس المعنى الذي ينتج عنه كل طلب في الاستعلام الذي يتم تحليله وتحسينه في كل مرة.
  • معالجة الاستعلام.
  • تحضير وإرجاع النتائج إلى العميل.

هذا مجرد نظرة عامة على أنواع الأشياء التي تقوم بها معظم أنظمة إدارة قواعد البيانات لمعالجة طلب SQL. أنت تكثف هذا النفقات العامة 500 مرة حتى إذا كان الاستعلام نفسه يعمل بسرعة نسبيا. تفاعلات قاعدة بيانات الأسفل حتى إلى قاعدة البيانات المحلية ليست رخيصة كما قد تتوقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top