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

Filter Early with WHERE Tip تحسين الأداء بالتصفية المبكرة

حسّن سرعة تنفيذ الاستعلام واستهلاك الذاكرة بنقل الشروط غير التجميعية من HAVING إلى WHERE.
1 صفوف تعليمية
MySQL
7 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

رغم أن MySQL يسمح نحوياً بكتابة شرط عادي على عمود التجميع داخل HAVING (مثل GROUP BY dept_id HAVING dept_id = 10)، إلا أن ذلك يُعد ممارسة خاطئة تضر بالأداء:

  • تكلفة التصفية المتأخرة: وضع شرط غير تجميعي في HAVING يعني منطقياً تجميع كل أقسام الجدول وحساب مجاميعها في الذاكرة أولاً ثم رميها جميعاً باستثناء القسم رقم 10!
  • سرعة التصفية المبكرة بـ WHERE: كتابة WHERE dept_id = 10 تصفّي الصفوف مبكراً عبر فهرس B-Tree قبل بدء التجميع أصلاً، مما يوفر استهلاك المعالج والذاكرة المؤقتة.

القاعدة الهندسية الثابتة: ضع كل شرط لا يحتوي على دالة تجميعية في WHERE، وخصص HAVING للشروط التجميعية فقط.

SQL
-- Best Practice: filter dept_id early in WHERE, not in HAVING
SELECT dept_id,
       job_role,
       COUNT(*)    AS role_count,
       AVG(salary) AS avg_salary
FROM employees
WHERE dept_id IN (10, 20)
  AND is_active = 1
GROUP BY dept_id, job_role
HAVING COUNT(*) >= 3;