في هذا الدرس 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 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) وهو الإشارة الحمراء التي تتطلب التحسين.
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(طول المفتاح المستغل بالبايت): يكشف لك كم عموداً من أعمدة الفهرس المركب تم استغلاله فعلياً في عملية البحث!
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.
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من الداخل (الخطوات المسننة الأعمق) إلى الخارج (الخطوة النهائية في الأعلى).
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 مقابل ALL | range يمسح نطاقاً مفهرساً؛ 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 CBO CBO
- Cost-Based Query Optimizer
- محسّن الاستعلامات القائم على حساب التكلفة في MySQL لاختيار أرخص خطة تنفيذ.
- للمراجعة
- 02 ICP ICP
- Index Condition Pushdown
- ميزة دفع شروط التصفية إلى محرك التخزين InnoDB وتظهر بعبارة Using index condition.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
افتح عميل MySQL 8.4 المحلي ونفّذ استعلام SQL المشروح في قسم قراءة خطة التنفيذ بـ EXPLAIN للتحقق من النتائج.
-
بدّل بين السيناريوهات الثلاثة في المحاكي التفاعلي ضمن قسم تدرج أنواع الوصول بالخطة وقارن مخرجات MySQL 8.4.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي4 أسئلة تنتظرك +
أي قيمة في عمود type ضمن مخرجات EXPLAIN تشير إلى حدوث فحص كامل مكلف للجدول (Full Table Scan)؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
ماذا تعني العبارة الإيجابية "Using index" عند ظهورها في عمود Extra ضمن مخرجات EXPLAIN؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
بماذا يختلف الأمر EXPLAIN ANALYZE عن الأمر التقليدي EXPLAIN في MySQL 8.4؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
أي أمر يحدّث إحصائيات توزيع الفهارس في محرك InnoDB عندما تلاحظ عدم دقة تقديرات المحسّن؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.