انتقل إلى محتوى الدرس
الدرس 54
دورة MySQL

تحليل خطط تنفيذ الاستعلامات باستخدام EXPLAIN في MySQLMySQL Analyzing Query Execution Plans with EXPLAIN

تعلّم تحليل خطط تنفيذ الاستعلامات باستخدام EXPLAIN في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

كيف تتأكد برمجياً من أن استعلام SELECT يستخدم الفهرس الذي أنشأته ولا يجري فحصاً كاملاً خفياً؟ يوفر MySQL 8.4 أداة التشخيص الهندسية الأهم EXPLAIN: فعند كتابة الكلمة EXPLAIN قبل أي استعلام، يعرض لك محسّن الاستعلامات القائم على التكلفة (Cost-Based Optimizer) خطة التنفيذ المتوقعة دون إرجاع صفوف البيانات الفعلية.

تتكون مخرجات EXPLAIN الجدولية من 12 عموداً تشخيصياً، أهمها للتحليل السريع:

  • type: طريقة وصول المحرك لصفوف الجدول (من الأسرع const إلى الأبطأ ALL).
  • possible_keys وkey: الفهارس المرشحة مقابل الفهرس الفعلي الذي وقع عليه اختيار المحسّن.
  • rows وfiltered: العدد التقديري للصفوف التي سيفحصها المحرك ونسبة الصفوف المتوقع بقاؤها بعد تطبيق الشروط.
  • Extra: تفاصيل داخلية حاسمة مثل القراءة من الفهرس فقط Using index أو التحذير من الفرز المكلف Using filesort.
مخطط تحليل خطط تنفيذ الاستعلامات باستخدام EXPLAIN في MySQL
SQL
EXPLAIN SELECT order_id, customer_id, total_amount FROM orders WHERE customer_id = 102;

يُعدّ العمود type المؤشر الأول الذي ينظر إليه مهندس الأداء عند فحص مخرجات EXPLAIN؛ فهو يحدد خوارزمية الوصول للصفوف مرتبةً من الأعلى كفاءةً إلى الأبطأ:

  • const: أسرع وصول على الإطلاق؛ يظهر عندما تبحث بمساواة على مفتاح أساسي PRIMARY KEY أو فريد UNIQUE، حيث يقرأ المحرك صفاً واحداً فقط ويعامله كثابت.
  • eq_ref: أفضل نوع وصول في عمليات الربط JOIN، ويحدث عندما يرتبط كل صف من الجدول الأول بصف واحد بالضبط في الجدول الثاني عبر مفتاحه الأساسي.
  • ref: بحث سريع بالمساواة = عبر فهرس ثانوي عادي قد يطابق بضعة صفوف.
  • range: مسح نطاق جزئي محدد داخل شجرة الفهرس (مع BETWEEN أو > أو IN).
  • index ثم ALL: يعني index مسح كامل شجرة الفهرس، بينما يعني ALL الفحص الكامل للجدول (Full Table Scan) وهو الإشارة الحمراء التي تتطلب التحسين.
SQL
EXPLAIN SELECT full_name FROM customers WHERE customer_id = 101;

محاكي فحص خطط التنفيذ EXPLAIN

عند قراءة مخرجات EXPLAIN لجدول يملك عدة فهارس، تبرز أهمية المقارنة بين ثلاثة أعمدة متجاورة: possible_keys وkey وkey_len:

  • possible_keys (الفهارس المرشحة): يعرض أسماء جميع الفهارس التي تصلح نظرياً لتنفيذ شرط البحث.
  • key (الفهرس المختار): يعرض اسم الفهرس الفائز الذي اختاره المحسّن فعلياً لأنه صاحب أقل تكلفة تقديرية (Lowest Cost). إذا كان possible_keys ممتلئاً بينما key = NULL، فهذا يعني أن المحسّن وجد أن قراءة الجدول مباشرة أرخص من القفز المتكرر عبر الفهرس (مثلاً عندما يطابق الشرط أكثر من 30% من صفوف الجدول).
  • key_len (طول المفتاح المستغل بالبايت): يكشف لك كم عموداً من أعمدة الفهرس المركب تم استغلاله فعلياً في عملية البحث!
SQL
EXPLAIN SELECT order_id, total_amount FROM orders WHERE customer_id = 102;

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

  • Using index (ممتاز جداً): تعني أن الاستعلام نُفّذ بالكامل من أوراق الفهرس الثانوي (Covering Index) دون الحاجة لقراءة أي صفحة من الجدول الأساسي!
  • Using index condition (جيد جداً): تفعيل ميزة دفع شرط الفهرس (Index Condition Pushdown - ICP) لتصفية الصفوف داخل محرك InnoDB قبل إرسالها لطبقة الخادم.
  • Using filesort (تحذير أداء): تعني أن الفهرس لم يكن مرتباً حسب جملة ORDER BY، فاضطر MySQL لإجراء خوارزمية فرز إضافية في الذاكرة (Sort Buffer) أو على القرص إذا كان الحجم كبيراً.
  • Using temporary (تحذير أداء): تعني أن MySQL أنشأ جدولاً مؤقتاً داخلياً لتنفيذ GROUP BY أو DISTINCT أو UNION.
SQL
EXPLAIN SELECT order_id, customer_id, total_amount FROM orders WHERE customer_id = 102 ORDER BY total_amount DESC;

يعتمد الأمر التقليدي EXPLAIN على الإحصائيات التقريبية المخزنة، وقد يقدّر أن الاستعلام سيفحص 10 صفوف بينما يفحص في الواقع 5,000 صف! لمعالجة هذه الفجوة، يوفر MySQL 8 أداة القياس الحقيقي EXPLAIN ANALYZE.

كيف يختلف EXPLAIN ANALYZE عن EXPLAIN العادي؟

  • ينفذ الاستعلام فعلياً: يشغّل المحرك الاستعلام بالكامل ويقيس الزمن الحقيقي المستغرق في كل خطوة ثم يتجاهل عرض جدول النتائج ليعرض شجرة القياس.
  • يقارن التقدير بالواقع: يعرض لك في كل عقدة كلاً من التقدير (cost=... rows=...) والقياس الحقيقي (actual time=start..end rows=... loops=...).
  • تُقرأ شجرة EXPLAIN ANALYZE من الداخل (الخطوات المسننة الأعمق) إلى الخارج (الخطوة النهائية في الأعلى).
SQL
EXPLAIN ANALYZE SELECT c.full_name, o.order_id FROM customers c INNER JOIN orders o ...;

يلخّص الجدول المرجعي التالي دلالة أعمدة وقيم EXPLAIN التشخيصية في MySQL 8.4 وكيفية التصرف الهندسي تجاه كل حالة:

العمود / المؤشرالقيم الشائعةالمعنى الهندسي في MySQL 8.4التقييم والإجراء المقترح
عمود type (ممتاز)const, eq_ref, refبحث مباشر عبر مفتاح فريد أو فهرس ثانويأداء مثالي؛ لا يحتاج إلى تعديل
عمود type (متوسط/حرج)range مقابل ALLrange يمسح نطاقاً مفهرساً؛ ALL يفحص الجدول كاملاًتخلص من ALL في الجداول الكبيرة بإضافة فهرس مناسب
عمودا key وkey_lenاسم الفهرس وطول البايتاتيحددان الفهرس المختار وعدد أعمدة البادئة المستغلةإذا كان key = NULL راجع شروط WHERE أو نفذ ANALYZE TABLE
عمود Extra (إيجابي)Using indexالفهرس يغطي كافة أعمدة الاستعلام (Covering Index)أعلى سرعة قراءة لأن المحرك لم يلمس صفحات الجدول
عمود Extra (تحذيري)Using filesort / temporaryفرز إضافي خارج الفهرس أو إنشاء جدول عمل مؤقتوسّع الفهرس المركب ليشمل أعمدة ORDER BY وGROUP BY
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

تعلمت في هذا الدرس قراءة خطط تنفيذ الاستعلامات عبر EXPLAIN، وتدرج أنواع الوصول في عمود type، ومقارنة الفهارس المرشحة possible_keys بالفهرس الفعلي key وطول البايتات key_len، وتفسير رسائل Extra، والقياس الزمني الفعلي عبر EXPLAIN ANALYZE.

الخطوة التالية والدرس القادم

في الدرس القادم والأخير من وحدة الفهارس سنتعلم تحسين أداء الاستعلامات وأفضل ممارسات الفهرسة مثل الشروط الصديقة للفهرس (Sargable Queries)، والفهارس الدالية، والفهارس المغطية، والتصفح السريع بالمؤشر (Keyset Pagination).

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 EXPLAIN Plans تحليل EXPLAIN
تعلّم تحليل خطط تنفيذ الاستعلامات باستخدام EXPLAIN في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Inspecting Plans with EXPLAIN قراءة خطة التنفيذ بـ EXPLAIN
المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم قراءة خطة التنفيذ بـ EXPLAIN في قواعد بيانات MySQL 8.4 الحديثة.
للمراجعة
03 EXPLAIN Access Types Hierarchy تدرج أنواع الوصول بالخطة
المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم تدرج أنواع الوصول بالخطة في قواعد بيانات MySQL 8.4 الحديثة.
للمراجعة
04 Comparing possible keys vs key الفهارس المرشحة والفهرس المختار
المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم الفهارس المرشحة والفهرس المختار في قواعد بيانات MySQL 8.4 الحديثة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 CBO CBO
Cost-Based Query Optimizer
محسّن الاستعلامات القائم على حساب التكلفة في MySQL لاختيار أرخص خطة تنفيذ.
للمراجعة
02 ICP ICP
Index Condition Pushdown
ميزة دفع شروط التصفية إلى محرك التخزين InnoDB وتظهر بعبارة Using index condition.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افتح عميل MySQL 8.4 المحلي ونفّذ استعلام SQL المشروح في قسم قراءة خطة التنفيذ بـ EXPLAIN للتحقق من النتائج.

  2. بدّل بين السيناريوهات الثلاثة في المحاكي التفاعلي ضمن قسم تدرج أنواع الوصول بالخطة وقارن مخرجات MySQL 8.4.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

4أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي4 أسئلة تنتظرك
01

أي قيمة في عمود type ضمن مخرجات EXPLAIN تشير إلى حدوث فحص كامل مكلف للجدول (Full Table Scan)؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.

02

ماذا تعني العبارة الإيجابية "Using index" عند ظهورها في عمود Extra ضمن مخرجات EXPLAIN؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.

03

بماذا يختلف الأمر EXPLAIN ANALYZE عن الأمر التقليدي EXPLAIN في MySQL 8.4؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.

04

أي أمر يحدّث إحصائيات توزيع الفهارس في محرك InnoDB عندما تلاحظ عدم دقة تقديرات المحسّن؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.