0Pricing
SQL Academy · درس

فهرسة JSONB باستخدام GIN

أنشئ فهارس GIN على مستندات JSONB، واستخدم jsonb_path_ops لاستعلامات الاحتواء السريعة

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

لماذا GIN مع JSONB

تحتوي مستندات JSONB على العديد من "العناصر" (أزواج المفتاح والقيمة وعناصر المصفوفات). وقد صُمم GIN (Generalised Inverted Index) للاستعلامات من نوع "الصفوف التي يحتوي مستندها على X".

فهرس GIN الافتراضي

تدعم فئة العوامل الافتراضية @> و? و?| و?&:

CREATE INDEX events_data_gin ON events USING GIN (data);

-- These now use the index:
SELECT * FROM events WHERE data @> '{"type":"login"}';
SELECT * FROM events WHERE data ? 'error';

jsonb_path_ops: أصغر وأسرع

نصف الحجم وأسرع في استعلامات الاحتواء فقط، لكنه يدعم @> فقط:

CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);

-- Supports @>
-- Does NOT support ?  ?|  ?&
SELECT * FROM events WHERE data @> '{"type":"login"}';

فهرسة مسار واحد فقط

إذا كنت تستعلم عن مفتاح واحد فقط، فسيكون فهرس B-tree للتعبير على القيمة المستخرجة أسرع:

CREATE INDEX events_user_id_idx
  ON events (((data->>'user_id')::BIGINT));

SELECT * FROM events WHERE (data->>'user_id')::BIGINT = 42;

الفهرسة داخل المصفوفات

استخدم فهرس GIN على مسار المصفوفة:

CREATE INDEX events_tags_gin
  ON events USING GIN ((data->'tags'));

SELECT * FROM events WHERE data->'tags' @> '["admin"]'::JSONB;

دمج فهرس JSONB مع عوامل تصفية أخرى

يمكن للعوامل المركبة استخدام فهرس GIN لجزء JSONB وفهرس آخر للجزء غير JSONB:

EXPLAIN ANALYZE
SELECT * FROM events
WHERE data @> '{"type":"login"}'
  AND ts >= NOW() - INTERVAL '7 days';
-- BitmapAnd: GIN index on data, B-tree on ts

أداء الكتابة في GIN

تحديثات GIN أثقل من تحديثات B-tree. وبالنسبة إلى الجداول التي تكثر فيها عمليات الكتابة جدًا، يجمع الخيار fastupdate تحديثات GIN في قائمة معلّقة، ويُفرغها VACUUM.

CREATE INDEX events_data_gin ON events USING GIN (data) WITH (fastupdate = on);

-- Flush manually if needed:
SELECT gin_clean_pending_list('events_data_gin');

حجم الفهرس

قد تكون فهارس GIN لـ JSONB كبيرة الحجم. وبالنسبة إلى الجداول الضخمة، فكّر في:

  • فهرسة مسارات محددة فقط (فهرس تعبير)
  • التحويل إلى jsonb_path_ops لاستعلامات الاحتواء فقط
  • نقل الحقول كثيرة الاستخدام إلى أعمدة حقيقية

الدمج مع Trigram

للبحث النصي التقريبي داخل JSONB، استخرج القيمة إلى تعبير TEXT وأضف فهرس GIN باستخدام pg_trgm:

CREATE INDEX events_message_trgm
  ON events USING GIN ((data->>'message') gin_trgm_ops);

متى لا تساعد الفهرسة

إذا كان عامل التصفية يطابق كل صف (انتقائية منخفضة جدًا)، فقد يختار المخطط إجراء فحص تسلسلي حتى مع وجود الفهرس. استخدم EXPLAIN ANALYZE للتأكد.

صيانة فهارس JSONB

تتضخم فهارس GIN مثل أي فهرس آخر. استخدم REINDEX CONCURRENTLY دوريًا:

REINDEX INDEX CONCURRENTLY events_data_gin;

مراجعة

يحوّل GIN عوامل تصفية JSONB إلى عمليات بحث تستغرق أجزاء من الألف من الثانية.

  • GIN الافتراضي: @> و? و?| و?&
  • jsonb_path_ops: أصغر حجمًا ومخصص للاحتواء فقط
  • B-tree للتعبير على قيمة مستخرجة: الأسرع لمفتاح واحد

تحقق سريع

أنت لا تستعلم مطلقًا إلا باستخدام data @> ... على عمود JSONB. أي فهرس يوفر أصغر حجم مع دعم كامل للميزات؟

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

هل درس «فهرسة JSONB باستخدام GIN» مجاني؟

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

ماذا ستتعلم في «فهرسة JSONB باستخدام GIN»؟

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

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

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

كم من الوقت يستغرق درس «فهرسة JSONB باستخدام GIN»؟

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

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

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

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

  1. JSONB مقابل JSON: متى تستخدم كلًّا منهما
  2. معاملات المسار: -> ->> @>
  3. فهرسة JSONB باستخدام GIN
  4. النمذجة: متى يتفوق JSONB على التطبيع
← العودة إلى SQL Academy