Vooteam Logo

الفهرسة في Postgres

تطوير المواقع وتطبيقات الويب
23 يناير 2026·4 دقيقة قراءة

Mostafa Ragap

Full Stack Developer

مقدمة في فهرسة قواعد البيانات (Indexing)

تخيل أنك تبحث عن كلمة محددة في كتاب مكون من 500 صفحة. بدون "فهرس"، ستضطر لقراءة كل صفحة من البداية حتى تجد مرادك. هذا بالضبط ما تفعله قاعدة البيانات عندما تطلب منها بيانات بدون فهرسة.

الفهرسة هي تقنية تُستخدم لتسريع استعلامات قاعدة البيانات من خلال إنشاء مرجع مهيكل لمكان تخزين البيانات. بدلاً من فحص كل صف بنطاق كامل (Full Table Scan)، يعمل الفهرس كاختصار يتيح لقاعدة البيانات تحديد الموقع الدقيق للبيانات فوراً، مما يؤدي إلى تحسن هائل في الأداء.

طريقة مرئية لتحديد آخر إدخال

لو كان الجدول مُرتّب أبجديًا، فعملية البحث عن اسم هتكون أسرع بكتير، لأننا نقدر نتجاوز صفوف معيّنة من غير ما نراجعها.
فمثلًا، لو بندوّر على اسم “Zack” وإحنا عارفين إن البيانات مرتّبة أبجديًا، نقدر نروح مباشرة لنص الجدول ونشوف هل “Zack” بييجي قبل الصف ده ولا بعده.
بعد كده نكرر نفس الفكرة على النصف المتبقي من الصفوف، ونفضل نضيّق نطاق البحث خطوة خطوة.

كيف يعمل الفهرس؟ (مثال عملي)

إذا كان لدينا جدول يحتوي على أسماء، وكان الجدول مرتباً أبجدياً، فالبحث سيكون أسرع بكثير. لنفترض أننا نبحث عن "Zack" في قائمة مرتبة:

  1. لن نبدأ من حرف "A".
  2. سنقفز إلى منتصف القائمة لنرى إن كان "Zack" قبل أو بعد هذا الصف.
  3. سنستمر في تقسيم النتائج إلى النصف حتى نصل إليه.

هذه الطريقة تسمى البحث الثنائي (Binary Search). في قائمة غير مفهرسة، قد نحتاج إلى 8 عمليات فحص، بينما في القائمة المفهرسة قد نحتاج إلى 3 فقط. الفهارس تسمح لنا بإنشاء هذه القوائم المرتبة دون الحاجة إلى إعادة ترتيب الجدول الأصلي بالكامل، مما يوفر مساحة التخزين.

بهذه الطريقة احتجنا إلى 3 مقارنات فقط للوصول إلى النتيجة الصحيحة، بدلًا من 8 مقارنات في حالة البيانات غير المفهرسة.
الفهارس (Indexes) بتسمح لنا نكوّن قوائم مرتّبة من غير ما نضطر ننشئ جداول جديدة كاملة ومُرتبة، واللي كان هيستهلك مساحة تخزين كبيرة.

ما هو الفهرس بالضبط؟

الفهرس هو بنية بيانات منفصلة تخزن قيم عمود معين مع "مؤشرات" (Pointers) تشير إلى الصفوف الفعلية في الجدول الرئيسي.

فكر في الفهرس كقائمة جهات الاتصال في هاتفك. حتى لو كانت الأسماء تُخزن في الخلفية حسب وقت إضافتها، فإن القائمة التي تراها مرتبة أبجدياً لتجد الشخص بسرعة، وبمجرد الضغط على الاسم، "يشير" الهاتف إلى سجل البيانات الكامل لهذا الشخص.

هيكل شجرة B المتوازنة (B-tree)

تعتمد معظم قواعد البيانات (مثل PostgreSQL) في فهارسها على بنية تسمى B-tree. وهي شجرة ذاتية التوازن تبحث في البيانات في وقت لوغاريتمي $O(\log N)$.

  • الجذر (Root): تبدأ كل عملية بحث من الأعلى.
  • العقد (Nodes): يتم مقارنة القيمة المطلوبة؛ إذا كانت أصغر نتجه لليسار، وإذا كانت أكبر نتجه لليمين.
  • التحسين: لزيادة الكفاءة، تقوم الأشجار أحياناً بتخزين عدد محدود من الأحرف (مثلاً أول 4 أحرف فقط) لتسريع عملية المقارنة داخل الشجرة.

سنستعرض الفهرس الوارد في المثال السابق، ونوضّح كيفية ربطه بالجدول الأصلي لبيانات Friends

أنواع الفهارس

هناك نوعان رئيسيان من فهارس قواعد البيانات:

1. الفهارس العنقودية (Clustered Indexes)

هو الفهرس الفريد الذي يحدد كيفية التنظيم الفيزيائي للبيانات داخل الجدول.

  • يتم إنشاؤه تلقائياً عند تعريف المفتاح الأساسي (Primary Key).
  • يتم ترتيب الصفوف في الذاكرة بناءً على هذا الفهرس (غالباً تصاعدياً حسب المعرف ID).
  • البحث باستخدام المفتاح الأساسي هو الأسرع على الإطلاق لأن البيانات موجودة فعلياً بهذا الترتيب.

CREATE TABLE friends (id INT PRIMARY KEY, name VARCHAR, city VARCHAR);

2. الفهارس غير العنقودية (Non-Clustered Indexes)

هي هياكل منفصلة تماماً عن الجدول الأصلي. هي "خريطة" تحتوي على القيم المرتبة ومؤشر لمكان الصف في الجدول الرئيسي.

  • يمكن إنشاء عدة فهارس غير عنقودية على نفس الجدول (مثلاً فهرس للأسماء وفهرس للمدن).
  • أبطأ قليلاً من العنقودية لأنها تتطلب خطوة إضافية (الانتقال من الفهرس إلى مكان الصف في الذاكرة)، لكنها تظل أسرع بآلاف المرات من المسح الكامل للجدول.

تقنيات متقدمة في PostgreSQL

توفر PostgreSQL مرونة عالية في إنشاء الفهارس لتناسب احتياجات برمجية محددة:

  • الفهارس الجزئية (Partial Indexes): فهرسة جزء فقط من الصفوف (مثلاً فهرسة التعليقات "المبلغ عنها" فقط باستخدام شرط WHERE flagged IS TRUE). هذا يقلل حجم الفهرس ويزيد سرعته.
  • فهارس التعبير (Expression Indexes): مفيدة عندما تبحث باستخدام دوال، مثل البحث عن البريد الإلكتروني مع تجاهل حالة الأحرف:

CREATE INDEX users_lower_email_index ON users (lower(email));

الفهارس الفريدة (Unique Indexes): تضمن عدم تكرار القيم في عمود معين، مما يعزز سلامة البيانات ويسرع البحث لأن قاعدة البيانات تتوقف فور إيجاد النتيجة الأولى.

متى نستخدم الفهرسة؟ (قاعدة التوازن)

الفهرسة ليست "سحراً" مجانياً. إليك القاعدة الذهبية:

الفهارس تسّرع عمليات القراءة (SELECT)، لكنها تبطئ عمليات الكتابة (INSERT, UPDATE, DELETE).

لماذا؟ لأن قاعدة البيانات في كل مرة تعدل فيها البيانات، يجب أن تذهب لتحديث جميع الفهارس المرتبطة بها أيضاً.

كيف تختبر أداء الفهرس؟

في PostgreSQL، يمكنك استخدام الأمر EXPLAIN ANALYZE لمعرفة ما إذا كان الاستعلام يستخدم الفهرس أم يقوم بمسح كامل:

الخاتمة: التوسع بدقة

الفهرسة هي السر وراء بقاء قواعد البيانات سريعة مع نمو حجم البيانات. من خلال استبدال المسح العشوائي للهاردسك بهياكل B-tree المنظمة، أنت تحول عمليات البحث من كابوس خطي إلى عملية لوغاريتمية رشيقة.

للحفاظ على قمة الأداء:

  1. كن انتقائياً: فهرس الأعمدة التي تستخدمها كثيراً في WHERE.
  2. استخدم الأنواع المتقدمة (مثل الفهارس الجزئية) للمهام المحددة.
  3. تحقق دائماً من النتائج باستخدام EXPLAIN ANALYZE.

شكراً لاهتمامك بتطوير أداء قواعد البيانات الخاصة بك!

هل أنت مستعد لبدء مشروعك؟

دعنا نناقش كيف يمكننا مساعدتك في تحقيق أفكارك. احصل على عرض سعر واستشارة مجانية من فريق الخبراء لدينا.

Vooteam | الفهرسة في Postgres