محتويات الدورة

Django / الصحة ودليل الإنتاج / الدرس 14

أداء الاستعلام والقياس

قس عملا محدودا ممثلا وافحص شكل الاستعلام والخطة واحفظ المعنى عند تحسين الكلفة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اختيار المقياس والمهمة الممثلة
  • عد استعلام علاقة محلية معلومة
  • تقييم الكلفة الكلية وحفظ العقد

اختيار المقياس والمهمة الممثلة

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

فحص الشكل قبل إضافة الفهارس عميانا

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

عد استعلام علاقة محلية معلومة

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

python مثال تنفيذي معزول
from django.conf import settings
settings.configure(
    SECRET_KEY="synthetic-course-key",
    USE_I18N=False, USE_TZ=True,
    INSTALLED_APPS=[],
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    DEFAULT_AUTO_FIELD="django.db.models.AutoField",
    ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()

from django.db import connection, models
from django.test.utils import CaptureQueriesContext

class Instructor(models.Model):
    name = models.CharField(max_length=60)
    class Meta:
        app_label = "lab"

class Course(models.Model):
    instructor = models.ForeignKey(Instructor, on_delete=models.PROTECT)
    class Meta:
        app_label = "lab"

with connection.schema_editor() as editor:
    editor.create_model(Instructor)
    editor.create_model(Course)
owner = Instructor.objects.create(name="Mira")
Course.objects.create(instructor=owner)
Course.objects.create(instructor=owner)
with CaptureQueriesContext(connection) as queries:
    names = [row.instructor.name for row in Course.objects.select_related("instructor").order_by("pk")]
print(names)
print(len(queries))
الناتج المتوقع
['Mira', 'Mira']
1

تقاس القراءة فقط دون الإعداد وبقاعدة ذاكرية مؤقتة.

التجميع بوحدة التقرير المقصودة

يجمع المثال بالمجال ويعد الصفوف؛ تحدد values المفاتيح وannotate العدد والترتيب الثبات. قد يضاعف ربط مجموعتين التفاصيل ويفسد المجموع، فحدد الوحدة قبل distinct. قد يصحح عدًا ويترك جمعا خطأ؛ ادرس تجميعا مسبقا أو استعلاما فرعيا. تثبت العينة الصحة لا الخطة المثلى للجميع. وقد يصحح Count متميز عدّا واحدا ويترك مجموعا آخر متضاعفا، لذلك ينبغي مراجعة كل تجميع وفق وحدة التقرير لا اعتبار distinct دواء عاما.

python مثال تنفيذي معزول
from django.conf import settings
settings.configure(
    SECRET_KEY="synthetic-course-key",
    USE_I18N=False, USE_TZ=True,
    INSTALLED_APPS=[],
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    DEFAULT_AUTO_FIELD="django.db.models.AutoField",
    ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()

from django.db import connection, models
from django.db.models import Count

class Course(models.Model):
    category = models.CharField(max_length=30)
    class Meta:
        app_label = "lab"

with connection.schema_editor() as editor:
    editor.create_model(Course)
Course.objects.bulk_create([Course(category="web"), Course(category="web"), Course(category="data")])
rows = Course.objects.values("category").annotate(total=Count("pk")).order_by("category")
print([(row["category"], row["total"]) for row in rows])
الناتج المتوقع
[('data', 1), ('web', 2)]

التجميع بالفئة وعد واحد للمجموعة وفي العينة بيانات واحدة وويب اثنتان.

تقييم الكلفة الكلية وحفظ العقد

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

الأخطاء الشائعة وإصلاحها

يخفي العدد الأقل ردا ضخما

لماذا يحدث؟
قيس العدد وحده.
كيف تصلحه؟
قارن الصفوف والذاكرة والزمن.
كيف تتجنب تكراره؟
حدد المقياس أولا.

يتضاعف الجمع بعد ربط

لماذا يحدث؟
تغيرت وحدة التقرير.
كيف تصلحه؟
جمع مسبقا أو أعد الربط.
كيف تتجنب تكراره؟
اختبر تفاصيل متعددة مستقلة.

تسبب المؤجلة قراءات زائدة

لماذا يحدث؟
وصل المستهلك لما حذف.
كيف تصلحه؟
قس المسار الكامل.
كيف تتجنب تكراره؟
اعتبر الأعمدة عقدا.

اختبر فهمك

1. لماذا قد يسوء استعلام واحد عن عدة أصغر؟

اعرض الحل المشروح

قد يضاعف الربط وينقل أعمدة زائدة ويفرز ويجمع بكلفة. قارن الصفوف والخطة والزمن والذاكرة للعقد نفسه؛ فالعدد دليل لا نموذج كلفة كامل.

2. ماذا يحمي اختبار التراجع لتقرير مقيد بالمالك؟

اعرض الحل المشروح

احم الداخل والمستبعد ومعنى الجمع والترتيب وغياب الخاص ثم قس. ليس حذف الإذن وتكرار الإجمالي تحسينًا مقبولا.

أهم ما تعلمته

  • قس المسار المعني كاملا.
  • تحدد وحدة التقرير صحة الجمع.
  • ليس الدليل المحلي معيارا عاما.

المراجع الرسمية