شروط بتخلي الـ Index مايتستخدمش
حتى لو الـ Index موجود، شرط واحد غلط بيخلّيه مايتستخدمش. الدرس ده بيشرح قاعدة Sargability، والحالات اللي بتقع فيها من غير ما تاخد بالك، حتى في Laravel.
في الدرس ده هتتعلم
- تطبّق قاعدة Sargability: سيب العمود زي ما هو
- تعرف إمتى تستخدم Functional Index
- تعرف
ORوNULLوالـ Implicit Conversion بيأثروا إزاي
1. قاعدة Sargability
حتى لو الـ Index موجود، فيه شروط بتخلّيه مايتستخدمش. القاعدة اسمها Sargability: الشرط لازم يسيب العمود زي ما هو. أي دالة أو تحويل على العمود نفسه، القيم بتبقى مختلفة عن اللي متخزن في الـ Index، فمش هيعرف يستخدمه.
الـ Index هيتستخدم ولا لأ؟جرّب بنفسك
2. Laravel و whereDate
وLaravel نفسه ممكن يكتب كويري فيها دالة على العمود من غير ما تاخد بالك:
// ✗ بيطلع 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)، والكويري لازم تستخدم نفس التعبير بالظبط:
-- 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.
علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.