MySQL / التطبيقات الموثوقة والاستعلامات التحليلية / الدرس 9
قراءة EXPLAIN دون تخمين
افصل مسارات الوصول المقدرة والتنفيذ المقاس ونتائج الاستعلام المنطقية.
في هذه الصفحة
أهداف الدرس
- اقرأ مسارات الوصول والصفوف المقدرة وترتيب الربط.
- استخدم EXPLAIN ANALYZE مع إدراك التنفيذ وفي نطاق مصرح مناسب.
ابدأ بسؤال صحيح
استخدم البيانات الأصلية والفهرس الاختياري للعميل والوقت إن أُضيف سابقاً. تحقق أولاً من معنى الاستعلام وحجم نتيجته؛ فالخطة السريعة لتقرير خاطئ تظل خاطئة. سجل المخطط والمعاملات وتوزيع البيانات والإصدار والزمن قبل تغيير الفهارس. لا تثبت طلبات التدريب الثلاثة تسريع الإنتاج، لكنها توضح قراءة الأدلة.
تصف EXPLAIN خطة مقدرة
تعرض EXPLAIN FORMAT=TREE شجرة العمليات المختارة دون تنفيذ SELECT عادة. ويكشف الشكل التقليدي type و possible_keys و key و rows و filtered. تمثل possible_keys مرشحات بينما تسمي key المسار المختار. وتعد rows و filtered تقديرات لا أعداد نتائج مقاسة. قد يكون مسح جدول صغير خياراً عقلانياً رغم وجود فهرس مناسب ظاهرياً.
EXPLAIN FORMAT=TREE
SELECT id,placed_at FROM orders
WHERE customer_id=1 AND placed_at>='2026-01-01'
ORDER BY placed_at,id;
ابحث عن المسح أوالوصول المفهرس والتصفية وأي فرز صريح. يعتمد الاختيار على الإحصاءات والفهارس، لذا لا نفترض خطة أوزمناً ثابتاً. يعيد SELECT الرقمين 101 و 102 مهما كانت الخطة الصحيحة المختارة.
تنفذ ANALYZE فعلياً
تنفذ EXPLAIN ANALYZE العبارة وتعرض أزمنة العمليات والصفوف الفعلية والتكرارات بصيغة TREE في MySQL 8.4. لذلك تستهلك موارد وقد تنتظر أقفالاً. استخدم SELECT للقراءة ضمن بيئة تدريب أوتشخيص مصرح بها وبحد تنفيذ مناسب. راع عدد التكرارات عند فحص العمل المتكرر، ولا تقارن زمن طفل واحد بزمن الاستعلام كله دون فهم.
EXPLAIN ANALYZE
SELECT c.id,COUNT(o.id) AS n
FROM customers c LEFT JOIN orders o ON o.customer_id=c.id
GROUP BY c.id ORDER BY c.id;
لا يمكن توقع الأزمنة من البيانات لذا حُذفت عمداً. تحمل النتيجة المنطقية الأعداد 2 و 1 و 0 للعملاء 1 و 2 و 3. قارن الأعداد المقدرة والفعلية في كل عقدة؛ ويوجه الفرق الكبير إلى الإحصاءات أوانحراف التوزيع ولا يثبت وحده غياب فهرس.
فسر العمليات المكلفة في سياقها
تعني Using filesort تنفيذ عملية ترتيب، ولا يثبت الاسم استخدام ملفات قرصية. وقد يبقى العمل المؤقت في الذاكرة أويُرحّل إلى التخزين حسب الحدود والبيانات. يقلل الفهرس المغطي جلب الصفوف لكنه يزيد الصيانة. افحص الدوال والتحويلات الضمنية على الأعمدة المفهرسة التي قد تمنع نطاق وصول مفيداً، ثم أعد الصياغة دون تغيير المعنى.
اختبر فرضية واحدة كل مرة
قارن معاملات ممثلة، ومنها العملاء الشائعون والنادرون. تؤثر الإحصاءات والتخزين المؤقت والتزامن والحمل في القياسات. سجل تحسن القراءة وتكلفة الكتابة بعد اقتراح الفهرس. تجنب فرض فهرس لتجميل EXPLAIN فقد تسوء الخطة مع تغير البيانات. احتفظ بترحيل قابل للعكس وراقب العمل بعد النشر بدلاً من الاكتفاء بتجربة واحدة دافئة الذاكرة.
الأخطاء الشائعة وإصلاحها
تُعرض الصفوف المقدرة كأنها نتائج دقيقة.
- لماذا يحدث؟
- فُهم حقل rows في EXPLAIN العادية على أنه عد مقاس.
- كيف تصلحه؟
- قارنه بأدلة تنفيذ فعلي آمن وافحص الإحصاءات.
- كيف تتجنب تكراره؟
- صنّف كل كمية في الخطة كتقديرية أومقاسة.
تستهلك EXPLAIN ANALYZE موارد بصورة غير متوقعة.
- لماذا يحدث؟
- اعتُبرت وصفاً فقط بدلاً من تنفيذ فعلي.
- كيف تصلحه؟
- أوقف استعلام التشخيص عند الحاجة وابدأ بـ EXPLAIN العادية.
- كيف تتجنب تكراره؟
- راجع آثار العبارة وميزانية التنفيذ قبل ANALYZE.
اعتبار الفهرس معطلاً لأن الخطة اختارت المسح.
- لماذا يحدث؟
- يجعل صغر الجدول أوضعف الانتقائية المسح أرخص.
- كيف تصلحه؟
- قيّم بيانات ممثلة والتكلفة الكلية قبل تعديل المخطط.
- كيف تتجنب تكراره؟
- قيّم الزمن والموارد لا مجرد ظهور اسم فهرس.
اختبر فهمك
1. لماذا لا يثبت جدول الطلبات ذي الصفوف الثلاثة تسريعاً عشرة أضعاف؟
اعرض الحل المشروح
يخفي الحجم الصغير إدخال وإخراج الإنتاج والانحراف والذاكرة والتزامن. وقد تتجاوز ضوضاء القياس الفرق نفسه. استخدمه للتحقق من النتائج وفهم الخطة، ثم قس بيانات اصطناعية ممثلة بشروط قابلة للتكرار قبل إعلان نتيجة أداء.
2. أعد صياغة شرط يناير الذي يلف placed_at بـ DATE_FORMAT.
اعرض الحل المشروح
استخدم placed_at >= '2026-01-01' AND placed_at < '2026-02-01'. يعبّر النطاق عن الشهر الكامل دون تنسيق كل وقت مرشح، ويتيح لفهرس مناسب يبدأ بالوقت فرصة الوصول بالنطاق. تحقق من التكافؤ والخطة الفعلية.
أهم ما تعلمته
- تقدّر EXPLAIN العادية وتنفذ EXPLAIN ANALYZE وتقيس.
- تتبع الخطة المفيدة معنى صحيحاً وأدلة ممثلة.