الـ Composite Index وترتيب العواميد
Index على عمودين مش زي Indexين على كل عمود لوحده. والترتيب بيفرق جداً. الدرس ده بيشرح قاعدة Leftmost Prefix، وقاعدة ESR اللي بترتب بيها العواميد.
- تفهم الـ Composite Index بمثال دليل التليفونات
- تطبّق قاعدة Leftmost Prefix وتعرف إمتى الـ Range بيوقف اللي بعده
- ترتّب العواميد بقاعدة ESR
1. Index واحد على عمودين
الكويري دي بطيئة رغم إن فيه Index على city لوحده، و Index على country لوحده:
SELECT * FROM users WHERE country = 'EG' AND city = 'Cairo';المحتاج هنا Composite Index: 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:
- Equality: العواميد اللي بـ
=الأول. - Sort: بعدها عواميد الـ
ORDER BY. - 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 |