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

الـ Composite Index وترتيب العواميد

Index على عمودين مش زي Indexين على كل عمود لوحده. والترتيب بيفرق جداً. الدرس ده بيشرح قاعدة Leftmost Prefix، وقاعدة ESR اللي بترتب بيها العواميد.

في الدرس ده هتتعلم
  • تفهم الـ Composite Index بمثال دليل التليفونات
  • تطبّق قاعدة Leftmost Prefix وتعرف إمتى الـ Range بيوقف اللي بعده
  • ترتّب العواميد بقاعدة ESR

1. Index واحد على عمودين

الكويري دي بطيئة رغم إن فيه Index على city لوحده، و Index على country لوحده:

search.sql
SELECT * FROM users WHERE country = 'EG' AND city = 'Cairo';

المحتاج هنا Composite Index: Index واحد على العمودين مع بعض (country, city). وأهم حاجة تفهمها: الترتيب على العمود الأول، وبعدين التاني جوه كل قيمة من الأول. بالظبط زي دليل التليفونات: مترتب بالاسم الأخير، وبعدين الأول.

Composite Index على (country, city)جرّب بنفسك

دوس على كل كويري وشوف الـ Index هيقرا أنهي جزء. الأخضر = النتايج، والأصفر = اتقرا واترمى.

2. قاعدة Leftmost Prefix

علشان كده WHERE city = 'Cairo' لوحده مش هيستفيد. دي قاعدة Leftmost Prefix: Index على (a, b, c) بيخدم a، و a,b، و a,b,c، لكن b لوحده لأ. وترتيب الشروط في الـ WHERE مش مهم: WHERE city = ? AND country = ? هي هي WHERE country = ? AND city = ?.

3. قاعدة ESR

والقاعدة اللي بنرتب بيها العواميد اسمها ESR:

  1. Equality: العواميد اللي بـ = الأول.
  2. Sort: بعدها عواميد الـ ORDER BY.
  3. Range: الـ > و < و BETWEEN في الآخر.

مثال: WHERE status = 'paid' AND created_at > ? ORDER BY total DESC. حسب ESR الـ Index يبقى (status, total, created_at)، وكده مفيش Sort. ولو الـ Range بيقلل النتايج جداً، (status, created_at) ممكن يبقى أسرع والـ Sort يبقى رخيص. اقيس الاتنين بـ EXPLAIN ANALYZE.

4. هيستخدمه ولا لأ؟

الكويري على Index (a, b, c) بيستخدمه؟
WHERE a = 1 AND b = 2 ✓
WHERE b = 2 AND a = 1 ✓ الترتيب في الـ WHERE مش مهم
WHERE b = 2 ✗ غالباً
WHERE a = 1 AND c = 3 ◐ البحث بـ a، و c فلتر بس
WHERE a > 1 AND b = 2 ◐ الـ Range على a وقّف b
WHERE a = 1 ORDER BY b ✓ من غير Sort
WHERE a > 1 ORDER BY b ✗ للترتيب: Filesort
علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.