تصبح عملية الفهرسة في PostgreSQL أسهل بكثير عندما تتوقف عن التفكير بكلمات “فهرس أو لا فهرس” وتبدأ في التفكير من حيث شكل أحمال العمل.
BRIN و GIN هما مثال جيد لأنهما يحلان مشاكل تقريبًا متناقضة.
متى يساعد BRIN
BRIN مفيد جدًا للجداول الكبيرة حيث تكون القيم مرتبطة طبيعيًا بترتيب الصفوف الفيزيائية، مثل:
- الطوابع الزمنية في جداول الأحداث التي تُضاف فقط
- معرفات تزيد بشكل أحادي
- بيانات السلاسل الزمنية
يخزن ملخصات خفيفة لمدى الكتل بدلاً من فهرسة كل صف بشكل فردي. ولهذا السبب يمكن أن يكون صغيرًا مقارنة بشجرة B.
متى يساعد GIN
GIN مفيد عندما تحتاج إلى البحث داخل القيم المركبة:
jsonb
- المصفوفات
- المستندات النصية الكاملة
يقوم بفهرسة العناصر المحتواة بدلاً من معاملة القيمة بالكامل ككتلة غير شفافة.
مثال عملي
لجدول أحداث كبير:
CREATE INDEX events_created_at_brin_idx
ON events
USING BRIN (created_at);
لعمود jsonb:
CREATE INDEX users_preferences_gin_idx
ON users
USING GIN (preferences);
هذان كلاهما “فهارس”، لكنهما يحسنان أنواعًا مختلفة جدًا من الاستعلامات.
المقايضات
BRIN مضغوط ورخيص، ولكنه يعتمد على خصائص الترتيب.
GIN قوي، لكنه عادة ما يكون أكبر وأكثر تكلفة للصيانة عند الكتابة.
لهذا السبب فإن السؤال الصحيح ليس “أي واحدة أسرع؟” بل “أي واحدة تتناسب مع نمط الوصول؟”
قراءة إضافية