SQL Academy · درس

فهارس B-tree مقابل Hash مقابل GiST مقابل GIN

قارن أنواع الفهارس الرئيسية في PostgreSQL واختر النوع المناسب لاستعلامات المساواة والنطاق والهندسة وJSON والبحث في النص الكامل

الدرس 1 من 413 خطوة

فهارس B-tree مقابل Hash مقابل GiST مقابل GIN درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

نظرة عامة على أنواع الفهارس

يحتوي PostgreSQL على عدة أنواع من الفهارس، كل منها محسّن لنمط وصول مختلف:

  • B-tree — للمساواة والنطاقات، وهو الافتراضي
  • Hash — للمساواة فقط
  • GiST — للبيانات الهندسية والبحث في النص الكامل والاستخدامات المخصصة
  • GIN — للقيم المركبة، مثل المصفوفات وJSONB والبحث في النص الكامل
  • BRIN — لنطاقات الكتل، والجداول الضخمة والمرتبة
  • SP-GiST — للأشجار المقسّمة مكانيًا

B-tree: الافتراضي

يُستخدم في 95% من الحالات. ويدعم = و< و<= و> و>= وBETWEEN وORDER BY:

CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);

فهرس Hash

لعمليات البحث بالمساواة فقط. وهو آمن عند تعطل النظام منذ PG 10. أصغر وأسرع قليلًا من B-tree للمساواة البحتة، لكن نطاق استخدامه ضيق جدًا:

CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.

فهرس GiST

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

CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.

CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.

فهرس GIN

الفهرس المعكوس المعمّم — الأفضل للقيم المركبة التي يمكن أن يرتبط كل عنصر منها بعدة صفوف:

CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators

CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search

CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queries

فهرس BRIN

تلخّص فهارس Block Range INdexes نطاقات القيم لكل عدد من الصفحات. وهي صغيرة جدًا، بحجم كيلوبايتات لجداول بحجم تيرابايت، لكنها لا تكون فعالة إلا عندما تكون البيانات مرتبة فعليًا حسب العمود المفهرس:

CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.

مقارنة الأحجام

لجدول يحتوي على مليار صف:

  • B-tree على BIGINT: نحو 30 GB
  • BRIN على TIMESTAMPTZ: نحو 1 MB

يكون BRIN أصغر بكثير، لكنه لا يتفوق على B-tree إلا في الاستعلامات التسلسلية أو المرتبة.

اختيار نوع الفهرس

مسار اتخاذ القرار:

  • المساواة والنطاق على قيمة مفردة → B-tree
  • المساواة على مجموعة ضخمة من القيم المفردة → B-tree، ولا تستخدم Hash إلا بعد القياس
  • المصفوفات أو JSONB أو البحث في النص الكامل → GIN
  • أنواع النطاقات أو البيانات الهندسية أو النصوص التقريبية → GiST
  • جدول ضخم ومرتب وتتم إضافة البيانات إليه فقط → BRIN

مقايضات GIN

يُعد GIN الأسرع في استعلامات "العثور على جميع الصفوف التي تحتوي على X"، لكنه أبطأ من B-tree عند تنفيذ INSERT أو UPDATE. في الجداول كثيرة الكتابة جدًا، ضع في الاعتبار fastupdate=off للتحكم في قائمة الانتظار الخاصة بـ GIN.

فئات المعاملات

يعمل كل نوع من الفهارس مع معاملات محددة. يستخدم JSONB jsonb_path_ops لإنشاء فهارس احتواء أصغر وأسرع:

CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.

الفهارس المركبة حسب النوع

تستخدم فهارس B-tree المركبة المطابقة حسب البادئة اليسرى. تعمل فهارس GIN المركبة، لكنها أكبر حجمًا؛ وعادةً ما تنشئ فهارس GIN منفصلة لكل عمود.

مراجعة

اختر نوع الفهرس بما يناسب الاستعلام.

  • B-tree: الافتراضي
  • GIN: للمصفوفات وJSONB والبحث في النص الكامل
  • GiST: للنطاقات والبيانات الهندسية والنصوص التقريبية
  • BRIN: للاستعلامات التسلسلية والجداول التي تتم إضافة البيانات إليها فقط

تحقق سريع

تريد فهرسة عمود TEXT[] لاستعلامات "الاحتواء". ما نوع الفهرس المناسب؟

البدء مجانًا

تعلم SQL مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
46
الدروس
183

الأسئلة الشائعة

هل درس «فهارس B-tree مقابل Hash مقابل GiST مقابل GIN» مجاني؟

نعم — نص درس «فهارس B-tree مقابل Hash مقابل GiST مقابل GIN» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «فهارس B-tree مقابل Hash مقابل GiST مقابل GIN»؟

قارن أنواع الفهارس الرئيسية في PostgreSQL واختر النوع المناسب لاستعلامات المساواة والنطاق والهندسة وJSON والبحث في النص الكامل تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «فهارس B-tree مقابل Hash مقابل GiST مقابل GIN»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فهارس B-tree مقابل Hash مقابل GiST مقابل GIN
  2. الفهارس المركبة وترتيب الأعمدة
  3. الفهارس الجزئية وفهارس التعابير
  4. صيانة الفهارس وتضخمها
← العودة إلى SQL Academy