ترتيب أعمدة الفهرس المركب
قاعدة البادئة اليسرى واختيار ترتيب الأعمدة المناسب لحِمل العمل
ترتيب أعمدة الفهرس المركب درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
سؤال الفهرس المركب
بعد أن تتمكنوا من شرح فهرس ذي عمود واحد، يرفع المحاورون مستوى التحدي: 'تُجرون استعلامًا على customer_id وorder_date معًا. كيف ستفهرسون ذلك؟' الإجابة المتوقعة هي فهرس مركب (متعدد الأعمدة)، مع تبرير ترتيب الأعمدة.
يعلّمكم هذا الدرس قاعدة البادئة اليسرى، وهي الفكرة الوحيدة التي تفسر تقريبًا كل سؤال عن الفهارس المركبة قد تواجهونه.
ما هو الفهرس المركب
يفهرس الفهرس المركب عدة أعمدة على هيئة صف مرتب. إذ تُرتب الإدخالات أولًا حسب العمود الأول، ثم حسب العمود الثاني عند تساوي القيم، وهكذا، تمامًا كدليل الهاتف المرتب حسب اسم العائلة ثم الاسم الأول.
الترتيب مهم جدًا، لأن أولوية الفرز تتبع ترتيب الأعمدة الذي تعلنونه.
CREATE INDEX idx_orders_cust_date
ON orders (customer_id, order_date);قاعدة البادئة اليسرى
القاعدة الأساسية هي أن الفهرس المركب على (A, B, C) يمكن استخدامه مع الاستعلامات التي تصفّي على بادئة يسرى من هذه الأعمدة:
Aوحده: نعمA, B: نعمA, B, C: نعمBوحده: لاB, C: لا
فكروا في دليل الهاتف: يمكنكم العثور على جميع الأشخاص الذين اسم عائلتهم 'Smith'، لكن لا يمكنكم العثور بكفاءة على جميع الأشخاص الذين اسمهم الأول 'John' بغض النظر عن اسم العائلة، لأن الكتاب ليس مرتبًا بهذه الطريقة.
مثال تطبيقي: مطابقة البادئة
باستخدام الفهرس على (customer_id, order_date)، يمكن لهذه الاستعلامات استخدامه لأنها تبدأ بـ customer_id:
يستخدم الأول العمود الأول فقط. أما الثاني فيستخدم العمودين معًا، إذ يضيّق البحث على customer_id أولًا، ثم يبحث داخل الإدخالات المرتبة حسب التاريخ الخاصة بذلك العميل.
-- Uses the index (leading column)
SELECT * FROM orders WHERE customer_id = 42;
-- Uses the index fully (both columns, in order)
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';مثال تطبيقي: عدم مطابقة البادئة
يصفّي هذا الاستعلام على العمود الثاني فقط، لذلك لا يستطيع الفهرس على (customer_id, order_date) عمومًا قيادة البحث؛ فالإدخالات ليست مرتبة عالميًا حسب order_date.
إذا كان التصفية على order_date وحده نمطًا شائعًا، فستحتاجون إلى فهرس منفصل يبدأ بـ order_date.
-- Does NOT use idx_orders_cust_date efficiently
SELECT * FROM orders
WHERE order_date >= '2026-01-01';
-- Fix: an index that leads with order_date
CREATE INDEX idx_orders_date ON orders (order_date);المساواة قبل النطاق
هناك تحسين على مستوى المهندس الخبير: ضعوا الأعمدة المستخدمة مع المساواة (=) قبل الأعمدة المستخدمة مع نطاق (<، >، BETWEEN). فبمجرد أن يصل الفهرس إلى عمود نطاق، لا يعود قادرًا على استخدام الأعمدة اللاحقة لتضييق البحث.
بالنسبة إلى استعلام مثل status = 'paid' AND created_at > ?، يكون الترتيب الصحيح هو (status, created_at) وليس الترتيب العكسي.
-- Query: WHERE status = 'paid' AND created_at > '2026-01-01'
-- Good: equality column first
CREATE INDEX idx_orders_status_created
ON orders (status, created_at);اختيار العمود الأول
كيف تختارون العمود الذي يأتي أولًا؟ يريد المحاورون إجابة تستند إلى عبء العمل:
- ابدؤوا بالعمود الذي يظهر في أكبر عدد من الاستعلامات، وخاصةً بوصفه مرشح مساواة.
- فضّلوا عمودًا ذا انتقائية عالية (أي قيم مميزة كثيرة)، حتى تزيل الخطوة الأولى أكبر عدد من الصفوف.
- ضعوا احتياجات ORDER BY في الحسبان؛ فمطابقة ترتيب الفهرس قد تتجنب الفرز.
العمود الأول هو الذي ينفذ أكبر قدر من عمل التصفية ضمن مجموعة استعلاماتكم الفعلية.
الفهرس المركب يساعد في الفرز
يخدم الفهرس المركب أيضًا ORDER BY على بادئة يسرى. وبما أن الإدخالات مرتبة حسب customer_id ثم order_date، فإن استعلام طلبات عميل واحد مرتبة حسب التاريخ يصبح شبه مجاني، من دون الحاجة إلى فرز منفصل.
-- No sort step: the index already supplies this order
SELECT * FROM orders
WHERE customer_id = 42
ORDER BY order_date;لا تكدّسوا الفهارس المتكررة
يفرط المرشحون غالبًا في إنشاء الفهارس. فإذا كان لديكم بالفعل (customer_id, order_date)، فإن وجود فهرس منفصل على (customer_id) وحده يكون عادةً زائدًا؛ فالفهرس المركب يغطي أصلًا الاستعلامات التي تستخدم العمود الأول.
كل فهرس إضافي يستهلك مساحة تخزين ويبطئ عمليات الكتابة، لذلك فالهدف هو إنشاء أصغر مجموعة من الفهارس التي تغطي أنماط استعلاماتكم، وليس فهرسًا لكل عمود.
إثبات ذلك باستخدام EXPLAIN
وكما هي الحال دائمًا، تحققوا من اختيار المخطط. بعد إنشاء فهرس مركب، شغّلوا EXPLAIN وتحققوا مما إذا كان يظهر على هيئة Index Scan، ومن عدد الصفوف الذي يقدّره.
إذا عاد استعلام لا يطابق البادئة إلى فحص تسلسلي، فهذا دليل على أن ترتيب الأعمدة لا يتناسب مع عبء العمل، وهو بالضبط ما ستشرحونه للمحاور.
EXPLAIN
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';كيفية صياغة الإجابة في المقابلة
خلاصة موجزة:
'يرتّب الفهرس المركب أعمدته من اليسار إلى اليمين، لذلك يمكنه خدمة أي بادئة يسرى من هذه الأعمدة، لكنه لا يخدم مجموعة فرعية لاحقة منها. أبدأ بالعمود الأعلى استخدامًا في التصفية والأعلى انتقائية، وأضع شروط المساواة قبل شروط النطاق، وأطابق ORDER BY حيثما أمكن، ثم أتحقق باستخدام EXPLAIN.'
تحقق سريع
طبّق قاعدة البادئة اليسرى.
مراجعة: ترتيب الفهرس المركب
أهم النقاط:
- يُرتَّب الفهرس المركب من اليسار إلى اليمين؛ ولا يخدم إلا بادئة الأعمدة اليسرى منه.
- ابدأ بالعمود الأكثر استخدامًا في الاستعلامات والأعلى انتقائية.
- ضع أعمدة المساواة قبل أعمدة النطاق.
- يمكن لبادئة مطابقة أن تلبي أيضًا
ORDER BYمن دون إجراء فرز. - تجنّب الفهارس ذات العمود الواحد المكررة التي يغطيها فهرس مركب بالفعل، وتحقّق باستخدام
EXPLAIN.
التالي: الفهارس المغطية التي تلغي جلب heap بالكامل.
الأسئلة الشائعة
هل درس «ترتيب أعمدة الفهرس المركب» مجاني؟
نعم — نص درس «ترتيب أعمدة الفهرس المركب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «ترتيب أعمدة الفهرس المركب»؟
قاعدة البادئة اليسرى واختيار ترتيب الأعمدة المناسب لحِمل العمل تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «ترتيب أعمدة الفهرس المركب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهارس B-Tree وكيف تساعد
- ترتيب أعمدة الفهرس المركب
- الفهارس التغطوية وعمليات Index-Only Scan
- متى تضر الفهارس: عمليات الكتابة والانتقائية