بنناجح
المرحلة 2: تصميم الـ Indexes · الدرس 2 من 4 · 10 دقيقة

ليه الـ Optimizer ساعات بيتجاهل الـ Index؟

تعمل Index، والـ EXPLAIN يقول Full Table Scan. الداتابيز مش بتتجاهلك: الـ Optimizer بيحسب التكلفة ويختار الأرخص. الدرس ده بيوريك بيحسبها إزاي.

في الدرس ده هتتعلم
  • تعرّف الـ Selectivity والـ Cardinality
  • تفهم ليه ترتيب الصفوف على الـ Disk بيغيّر القرار
  • تحدّث الإحصائيات بـ ANALYZE وتعرف يعني إيه Data Skew

1. الـ Optimizer بيحسب التكلفة

تعمل Index على is_active، والـ EXPLAIN يقول Full Table Scan. الداتابيز مش بتتجاهلك: فيها Optimizer بيحسب تكلفة كل طريقة ويختار الأرخص. ولو 90% من المستخدمين active، الـ Index هيوصلك لـ 9 مليون صف، وكل صف = قراءة عشوائية. قراية الجدول بالتسلسل أرخص بكتير.

إمتى الـ Optimizer يختار الـ Index؟جرّب بنفسك

حرّك النسبة وشوف نقطة التقاطع. وبعدين علّم على “الصفوف مترتبة على الـ Disk” وشوف إيه اللي اتغير.

2. ترتيب الصفوف على الـ Disk

لاحظ حاجة مهمة في الرسمة: لو الصفوف متفرقة على الـ Disk، الـ Index ممكن يخسر حتى لو الشرط بيرجع أقل من 1%، لأن كل صف بيحتاج Page مختلفة. ولو الصفوف مترتبة بنفس العمود (زي الـ Clustered Index في InnoDB)، الـ Index بيكسب في نطاق أوسع بكتير. وفي PostgreSQL فيه حل وسط اسمه Bitmap Heap Scan: بيجمع أماكن الصفوف الأول، ويقرا الـ Pages بالترتيب.

3. الإحصائيات

والـ Optimizer بيحسب كل ده من إحصائيات، والإحصائيات دي عينة بتتحدّث كل فترة. لو عملت Import لملايين الصفوف، ممكن يبني قراره على صورة قديمة:

statistics.sql
-- MySQL
ANALYZE TABLE orders;
ANALYZE TABLE orders UPDATE HISTOGRAM ON status WITH 16 BUCKETS;  -- توزيع القيم

-- PostgreSQL
ANALYZE orders;
علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.