فهارس B-Tree وكيف تساعد
ما الذي يخزنه الفهرس فعليًا والعمليات التي يسرّعها
فهارس B-Tree وكيف تساعد درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
لماذا يسأل المحاورون عن الفهارس
عندما يقول المحاور: 'هذا الاستعلام بطيء، ماذا تفعل؟'، فإن الإجابة التي ينتظرها تتضمن في معظم الأحيان فهرسًا. فالفهارس هي العامل الأقوى منفردًا في تحسين أداء القراءة، ولذلك فهي تميّز بين المرشحين الذين حفظوا الصياغة والذين يفهمون كيف تعثر قاعدة البيانات فعليًا على الصفوف.
في هذا الدرس، ستبنون نموذجًا ذهنيًا دقيقًا عن فهرس B-Tree: ما الذي يخزّنه، والعمليات التي يسرّعها، وكيف تتحدثون عنه بالطريقة التي يتحدث بها مهندس خبير.
المشكلة التي يحلها الفهرس
من دون فهرس، يتطلب العثور على الصفوف المطابقة لشرط ما أن تقرأ قاعدة البيانات كل صف في الجدول. وهذا ما يسمى فحصًا تسلسليًا (أو فحصًا كاملًا للجدول). ففي جدول يضم مليون صف، يعني ذلك إجراء مليون فحص للصفوف حتى لو كان صف واحد فقط مطابقًا.
الفهرس هو بنية بيانات منفصلة ومرتبة تتيح للمحرك الانتقال مباشرةً إلى الصفوف المطابقة، تمامًا كما يتيح فهرس الكتاب العثور على موضوع ما من دون قراءة كل صفحة.
-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';ما الذي يخزّنه B-Tree فعليًا
الفهرس الافتراضي في PostgreSQL وMySQL وSQL Server ومعظم المحركات هو B-Tree (شجرة متوازنة). إذ يخزّن قيم العمود المفهرس في ترتيب مرتب، وينظمها في شجرة ضحلة من الصفحات.
- تحتوي كل عقدة ورقية على مفاتيح الفهرس بالإضافة إلى مؤشر إلى صف الجدول الفعلي.
- تبقى الشجرة متوازنة، لذلك لا يلمس أي بحث سوى عدد قليل من الصفحات، بغض النظر عن حجم الجدول.
ينتقل البحث من الجذر إلى عقدة ورقية في نحو log(N) خطوة بدلًا من فحص جميع الصفوف وعددها N.
إنشاء الفهرس الأول
تنشئون فهرس B-Tree باستخدام CREATE INDEX. سمّوه بوضوح حتى يعرف المراجع الجدول والأعمدة من النظرة الأولى.
بعد إنشاء هذا الفهرس، يمكن لاستعلام يصفّي على email استخدامه للعثور على الصف المطابق عبر عدد قليل من قراءات الصفحات، بدلًا من إجراء فحص كامل.
CREATE INDEX idx_users_email ON users (email);
-- Now this lookup uses the index instead of scanning
SELECT * FROM users WHERE email = 'ada@example.com';العمليات التي يسرّعها B-Tree
لأن B-Tree يحافظ على القيم في حالة ترتيب، فإنه يسرّع عمليات تتجاوز المطابقات التامة بكثير. ويسعد المحاورين عندما تذكرون هذه العمليات بدقة:
- المساواة:
WHERE email = ? - النطاق:
WHERE age > 30، وBETWEEN، و<، و>= - مطابقة البادئة:
WHERE name LIKE 'Ada%'(لكن ليس'%da') - ORDER BY على العمود المفهرس، مما يتجنب الفرز
- MIN/MAX، لأنهما يقعان عند طرفي البنية المرتبة
مثال تطبيقي: استعلام نطاق
لنفترض وجود جدول orders يضم ملايين الصفوف. يطلب استعلام للتقارير الطلبات الحديثة. باستخدام فهرس على created_at، ينتقل المحرك إلى بداية النطاق في الفهرس المرتب، ثم يتقدم فقط بالقدر المطلوب.
يحوّل الفهرس فحص الجدول كاملًا إلى فحص نطاق محدود، فلا يقرأ إلا الجزء المطابق.
CREATE INDEX idx_orders_created_at ON orders (created_at);
SELECT order_id, total
FROM orders
WHERE created_at >= '2026-01-01'
AND created_at < '2026-02-01';الفهارس تساعد في الفرز أيضًا
هناك نقطة يغفل عنها كثيرون: بما أن الفهرس مرتب مسبقًا، يستطيع المحرك إرجاع الصفوف بترتيب الفهرس وتخطي خطوة فرز منفصلة. وهذا مهم مع ORDER BY، وخاصةً مع ترقيم الصفحات لأفضل عدد N من النتائج.
إذا قمتم بالفرز حسب عمود له فهرس مطابق، يمكن للمحسّن قراءة الفهرس بالترتيب والتوقف مبكرًا بمجرد حصوله على عدد كافٍ من الصفوف.
-- Index on created_at lets this avoid a sort and stop after 10 rows
SELECT order_id, total
FROM orders
ORDER BY created_at DESC
LIMIT 10;التكلفة الخفية: جلب الصف من الكومة
يخزّن فهرس B-Tree العادي العمود المفهرس فقط، بالإضافة إلى مؤشر للصف. لذلك، بعد العثور على الإدخالات المطابقة، لا يزال على المحرك الانتقال إلى الجدول (الكومة) لقراءة الأعمدة الأخرى التي حددتموها.
تُسمى هذه القفزة الثانية جلب الصف من الكومة. وهي غير مكلفة عند التعامل مع بضعة صفوف، لكنها تصبح مكلفة عندما يطابق الاستعلام عددًا كبيرًا من الصفوف، وهذا أحد أسباب تجاهل فهرس منخفض الانتقائية أحيانًا. (سترون لاحقًا كيف تحل الفهارس المغطية هذه المشكلة.)
التأكد من استخدام الفهرس
لا تدّعوا استخدام الفهرس؛ أثبتوا ذلك باستخدام EXPLAIN. وفي المقابلة، يُظهر شرحكم للخطة فهمًا حقيقيًا.
- يعني
Seq Scanأن الفهرس لم يُستخدم. - يعني
Index ScanأوIndex Seekأنه استُخدم.
إذا أضفتم فهرسًا وما زلتم ترون فحصًا تسلسليًا، فهذا يعني أن المخطط رأى أن الفحص أقل تكلفة، وغالبًا لأن الاستعلام يطابق نسبة كبيرة جدًا من الجدول.
EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_emailالمفاتيح الأساسية مفهرسة مسبقًا
من الحيل الشائعة في المقابلات: إن تعريف قيد PRIMARY KEY أو UNIQUE ينشئ تلقائيًا فهرس B-Tree داعمًا. لذلك لا تحتاجون إلى إضافة فهرس ثانٍ على العمود نفسه، ولا ينبغي لكم فعل ذلك.
ولهذا تكون عمليات الربط والبحث باستخدام المفاتيح الأساسية سريعة أصلًا، ولهذا فإن سؤال «هل ينبغي أن أفهرس العمود id؟» يكون عادةً فخًا؛ فقد تم ذلك مسبقًا نيابةً عنكم.
-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email TEXT UNIQUE
);كيفية صياغة الإجابة في المقابلة
اجمعوا الفكرة في جملة واضحة يمكن للمحاور أن يوافق عليها:
'فهرس B-Tree هو بنية مرتبة ومتوازنة تتيح للمحرك العثور على الصفوف عبر قراءة صفحات بعدد قدره log(N)، بدلًا من فحص الجدول كاملًا. وهو يسرّع عمليات المساواة والنطاق والبادئة وORDER BY على الأعمدة المفهرسة، لكن كل تطابق لا يزال يتطلب جلبًا من الكومة لقراءة الأعمدة غير المفهرسة.'
ثم ادعموا ذلك باستخدام EXPLAIN. فهذا الجمع بين النموذج الذهني والدليل هو ما يحصد النقاط.
تحقق سريع
اختبروا نموذجكم الذهني لما يسرّعه فهرس B-Tree.
مراجعة: فهارس B-Tree
أهم الخلاصات التي ينبغي اصطحابها إلى الدرس التالي:
- يخزّن B-Tree القيم المفهرسة بترتيب مرتب داخل شجرة متوازنة، مما يوفر عمليات بحث باستخدام
log(N). - يسرّع المساواة والنطاق والبادئة (LIKE ذي البادئة) وORDER BY وMIN/MAX.
- لا يزال كل تطابق يحتاج إلى جلب من الكومة للأعمدة غير الموجودة في الفهرس.
- يؤدي وضع عمود داخل دالة أو استخدام حرف بدل في البداية إلى تعطيل الفهرس.
- تحققوا دائمًا باستخدام
EXPLAIN؛ إذ تُفهرس قيود PRIMARY KEY وUNIQUE تلقائيًا.
التالي: كيفية ترتيب الأعمدة عندما يغطي فهرس واحد عدة أعمدة في آن واحد.
الأسئلة الشائعة
هل درس «فهارس B-Tree وكيف تساعد» مجاني؟
نعم — نص درس «فهارس B-Tree وكيف تساعد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «فهارس B-Tree وكيف تساعد»؟
ما الذي يخزنه الفهرس فعليًا والعمليات التي يسرّعها تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «فهارس B-Tree وكيف تساعد»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهارس B-Tree وكيف تساعد
- ترتيب أعمدة الفهرس المركب
- الفهارس التغطوية وعمليات Index-Only Scan
- متى تضر الفهارس: عمليات الكتابة والانتقائية