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

شروط بتخلي الـ Index مايتستخدمش

حتى لو الـ Index موجود، شرط واحد غلط بيخلّيه مايتستخدمش. الدرس ده بيشرح قاعدة Sargability، والحالات اللي بتقع فيها من غير ما تاخد بالك، حتى في Laravel.

في الدرس ده هتتعلم
  • تطبّق قاعدة Sargability: سيب العمود زي ما هو
  • تعرف إمتى تستخدم Functional Index
  • تعرف OR و NULL والـ Implicit Conversion بيأثروا إزاي

1. قاعدة Sargability

حتى لو الـ Index موجود، فيه شروط بتخلّيه مايتستخدمش. القاعدة اسمها Sargability: الشرط لازم يسيب العمود زي ما هو. أي دالة أو تحويل على العمود نفسه، القيم بتبقى مختلفة عن اللي متخزن في الـ Index، فمش هيعرف يستخدمه.

الـ Index هيتستخدم ولا لأ؟جرّب بنفسك

2. Laravel و whereDate

وLaravel نفسه ممكن يكتب كويري فيها دالة على العمود من غير ما تاخد بالك:

where-date.php
// ✗ بيطلع  where date(created_at) = ?  ← الدالة على العمود
Order::whereDate('created_at', '2026-10-09')->get();

// ✓ Range على العمود نفسه
Order::where('created_at', '>=', '2026-10-09')
     ->where('created_at', '<', '2026-10-10')
     ->get();

3. الـ Functional Index

ولو لازم تبحث بقيمة محسوبة، اعمل Index على التعبير نفسه (Functional Index)، والكويري لازم تستخدم نفس التعبير بالظبط:

functional-index.sql
-- MySQL 8.0.13+ (لاحظ القوسين)
CREATE INDEX idx_users_email_lower ON users ((LOWER(email)));
-- PostgreSQL
CREATE INDEX idx_users_email_lower ON users (lower(email));

4. OR و NULL

وبالنسبة لـ OR و NULL:

  • WHERE a = 1 OR b = 2: لو على كل عمود Index، ممكن Index Merge (MySQL) أو BitmapOr (PostgreSQL). غير كده Full Scan. وساعات UNION ALL أوضح.
  • != و NOT IN: غالباً بيرجعوا نسبة كبيرة، فالـ Scan بيكسب.
  • IS NULL: في MySQL و PostgreSQL الـ B-Tree بيخزّن الـ NULLs، فـ WHERE deleted_at IS NULL ممكن تستخدم Index.
علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.