سؤال

لنفترض أن لدي جدولين مثل هؤلاء:

Employers (id, name, .... , deptId).
Depts(id, deptName, ...).

لكن هذه البيانات لن يتم تعديلها كثيرًا وأريد استعلامًا مثل هذا

SELECT name, deptName FROM Employers, Depts 
    WHERE deptId = Depts.id AND Employers.id="ID"

يكون أسرع ما يمكن.

يأتي في ذهني حلان محتملان:

  • عدم تسوية الجدول:

    على الرغم من ذلك، مع هذا الحل، سأفقد بعض المزايا الرائعة لامتلاك قواعد بيانات "مقيسة"، ولكن الأداء هنا أمر لا بد منه.

  • قم بإنشاء طريقة عرض لتلك البيانات غير الطبيعية.

    سأحافظ على تطبيع البيانات و (هنا سؤالي)، سيكون أداء الاستعلام عبر طريقة العرض هذه أسرع من دون طريقة العرض هذه.

أو بطريقة أخرى لطرح نفس السؤال، يتم "تفسير" العرض في كل مرة تقوم فيها بإجراء استعلام عليه، أو كيف تعمل طرق عرض الأشياء في DBA؟.

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

المحلول

بشكل عام، ما لم تقم "بتجسيد" طريقة عرض، وهو خيار في بعض البرامج مثل MS SQL Server، تتم ترجمة طريقة العرض فقط إلى استعلامات مقابل الجداول الأساسية، وبالتالي فهي ليست أسرع أو أبطأ من النسخة الأصلية (مطروحًا منها الكمية الضئيلة من الوقت الذي تستغرقه ترجمة الاستعلام، وهو لا يُقارن بالتنفيذ الفعلي للاستعلام).

كيف تعرف أن لديك مشاكل في الأداء؟هل تقوم بتوصيفه تحت الحمل؟هل تأكدت من أن عنق الزجاجة في الأداء هو هذين الجدولين؟بشكل عام، حتى تحصل على بيانات ثابتة، لا تفترض أنك تعرف من أين تأتي مشكلات الأداء، ولا تقضي أي وقت في التحسين حتى تعرف أنك تقوم بتحسين الشيء الصحيح - 80% من مشكلات الأداء تأتي من 20 % من الكود.

نصائح أخرى

إذا كان Depts.ID هو المفتاح الأساسي لهذا الجدول، وقمت بفهرسة الحقل Employers.DeptID، فيجب أن يظل هذا الاستعلام سريعًا للغاية حتى عبر ملايين السجلات.

إن إلغاء التطبيع لا معنى له بالنسبة لي في هذا السيناريو.

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

يمكنك استخدام طريقة عرض مادية (أو "لقطة" كما يقول البعض)، ولكن بعد ذلك ستكون بياناتك حديثة مثل آخر تحديث قمت به.

في تعليق على أحد الردود، يوضح صاحب السؤال أنه يبحث عن طريقة لإنشاء عرض ملموس في MySQL.

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

ما عليك القيام به هو هذا:

  1. قم بإنشاء التجسيد الأولي لنتيجة الاستعلام الخاص بك.
  2. قم بإنشاء مشغل عند الإدراج في جدول أصحاب العمل الذي يقوم بإدراج جميع الصفوف التي تطابق صاحب العمل المدرج حديثًا في الجدول الذي تم إنشاؤه.
  3. قم بإنشاء مشغل عند الحذف في جدول أصحاب العمل الذي يحذف الصفوف المقابلة من الجدول الذي تم تحقيقه.
  4. قم بإنشاء مشغل عند التحديث في جدول أصحاب العمل الذي يقوم بتحديث الصفوف المقابلة في الجدول الذي تم تحقيقه.
  5. نفس الشيء بالنسبة لجدول الأقسام.

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

يبدو الأمر وكأنه تحسين سابق لأوانه إلا إذا كنت تعلم أنها مشكلة واضحة وحاضرة.

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

لكن طرق العرض أيضًا "تخفي" أشياء من المطورين الذين يحتفظون بالكود في المستقبل لجعلهم يتخيلون أن الاستعلام أقل تعقيدًا مما هو عليه في الواقع.

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