ليه الـ 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 مليون صف، وكل صف = قراءة عشوائية. قراية الجدول بالتسلسل أرخص بكتير.
حرّك النسبة وشوف نقطة التقاطع. وبعدين علّم على “الصفوف مترتبة على الـ Disk” وشوف إيه اللي اتغير.
2. ترتيب الصفوف على الـ Disk
لاحظ حاجة مهمة في الرسمة: لو الصفوف متفرقة على الـ Disk، الـ Index ممكن يخسر حتى لو الشرط بيرجع أقل من 1%، لأن كل صف بيحتاج Page مختلفة. ولو الصفوف مترتبة بنفس العمود (زي الـ Clustered Index في InnoDB)، الـ Index بيكسب في نطاق أوسع بكتير. وفي PostgreSQL فيه حل وسط اسمه Bitmap Heap Scan: بيجمع أماكن الصفوف الأول، ويقرا الـ Pages بالترتيب.
3. الإحصائيات
والـ Optimizer بيحسب كل ده من إحصائيات، والإحصائيات دي عينة بتتحدّث كل فترة. لو عملت Import لملايين الصفوف، ممكن يبني قراره على صورة قديمة:
-- MySQL
ANALYZE TABLE orders;
ANALYZE TABLE orders UPDATE HISTOGRAM ON status WITH 16 BUCKETS; -- توزيع القيم
-- PostgreSQL
ANALYZE orders;