فهرسة PostgreSQL وتحسين الاستعلام: من الشرح إلى الفهارس المركبة
طريقة عملية لقراءة شرح التحليل، واختيار B-tree والفهارس الجزئية/المغطية، وتجنب تمدد الفهرس الثقيل للكتابة.
علي مرتضوي
مؤسس بارادايس كود
غالبًا ما يكون البطء مؤشرًا خاطئًا، وليس مؤشرًا مفقودًا
فهرسة كل ضرائب عمود تمت تصفيتها تتم كتابتها وتفريغها دون حفظ القراءات. تأتي الفهارس الجيدة من الأشكال الحقيقية WHERE وJOIN وORDER BY، وليس من التخمينات. ابحث عن الاستعلامات البطيئة المتكررة في logs/`pg_stat_statements` أولاً، ثم قم بتصميم فهارس لتلك الأنماط.
الهدف هو قراءة عدد أقل من الصفحات وعدد أقل من عمليات الفرز/المسح التسلسلي غير الضرورية، وليس "العديد من الفهارس".
قراءة شرح وتحليل دون غموض
لا داعي للذعر عند `Seq Scan`؛ على طاولات صغيرة يمكن أن يكون صحيحا. يظهر الخطر عندما تتباعد الصفوف المقدرة عن الفعلية، أو عندما تضرب "الحلقة المتداخلة" مجموعة كبيرة بتكلفة عالية. انظر إلى "المخازن المؤقتة" والوقت الفعلي لكل عقدة لفصل الإدخال/الإخراج عن ألم وحدة المعالجة المركزية/الفرز.
الإحصائيات القديمة هي القاتل الصامت. بعد إجراء تغييرات كبيرة في البيانات، خذ "ANALYZE" على محمل الجد. إذا كان المخطط لا يتفق مع الواقع، قم بإصلاح الإحصائيات والانتقائية قبل إضافة فهرس آخر.
شجرة B والفهارس المركبة وترتيب الأعمدة
من أجل المساواة والمدى على الكميات القياسية، B-tree هو الإعداد الافتراضي الصحيح. في الفهارس المركبة، يجب أن يتطابق ترتيب الأعمدة مع مرشحات المساواة المتكررة أولاً، ثم أعمدة النطاق/الفرز. `(tenant_id, create_at)` يناسب "مستأجر واحد في نطاق زمني"؛ والعكس في كثير من الأحيان لا يحدث.
عندما يُرجع استعلام سريع أعمدة قليلة، فإن فحص التغطية/الفهرس فقط باستخدام `INCLUDE` يمكن أن يؤدي إلى قطع عمليات جلب الكومة. قم بقياسه على المسارات الساخنة — لا تقم بتطبيقه على كل تحديد.
الفهارس الجزئية والتعبيرية لـ SaaS
في الأنظمة متعددة المستأجرين، تعمل الفهارس الجزئية مثل `WHEREdeleted_at IS NULL` أو `WHERE Status = 'active'` على إبقاء الفهارس صغيرة وذات صلة. فهارس التعبيرات في `LOWER(email)` مهمة للبحث غير الحساس لحالة الأحرف - فقط إذا كانت الاستعلامات تستخدم نفس التعبير.
قم بتسمية الفهارس الجزئية بعد نمط الوصول إلى المنتج حتى يعرف الفريق سبب وجودها. تصبح الفهارس التي لا مالك لها معزولة عبر عمليات الترحيل.
تكلفة الأقفال والكتابة وصيانة الفهرس
كل فهرس إضافي يفرض ضرائب على إدراج/تحديث/حذف. في الجداول ذات الكتابة الثقيلة، يتفوق مؤشران متوسطان صحيحان على ستة فهارس "قد نحتاج لاحقًا". بالنسبة لعمليات ترحيل الجداول الكبيرة، استخدم `CREATE INDEX CONCURRENTLY` حتى لا تؤدي الأقفال الطويلة إلى إيقاف الخدمة.
مراقبة الانتفاخ. الفهارس المتضخمة بطيئة في القراءة أيضًا. في الجداول ذات الإلحاق الثقيل، غالبًا ما يتفوق التقسيم المستند إلى الوقت على فهرس عملاق واحد.
أعد كتابة الاستعلام قبل إضافة المزيد من الفهارس
في بعض الأحيان، لا يكون الفهرس هو الخطأ: `SELECT *`، أو ORM N+1s، أو التصفية على عمود محسوب بواسطة العميل. ادفع عوامل التصفية إلى SQL، واجعل الصلات واضحة، واستبدل ترقيم صفحات OFFSET العميق بترقيم صفحات مجموعة المفاتيح. تعويض 100000 هو العمل الضائع المتكرر.
لإعداد التقارير المكثفة، قم بتقسيم المسار عبر الإنترنت: جداول ملخصة، أو طرق عرض متحققة، أو متجر تحليلات. لا تخنق OLTP بفحص BI.
حلقة تحسين عملية للفرق
قم بمراجعة أهم الاستعلامات أسبوعيًا: صفحة 95 والمكالمات وتغييرات الخطة. يجب أن يسجل كل فهرس جديد قبل/بعد الاستعلامات وسببًا تجاريًا. هذا الانضباط يمنع فهارس الفولكلور.
يعد التحسين المستدام جزءًا من تم: الميزة التي تحتوي على مرشح جديد ولا توجد خطة فهرس هي ديون مقصودة.
الأسئلة الشائعة
هل يجب أن يحصل كل مفتاح خارجي على فهرس؟
إذا قمت بالانضمام/الحذف/أين عليه، عادةً نعم. لا يضمن FK وحده مؤشرًا منفصلاً - اختر القياس.
متى يكون GIN هو الاختيار الصحيح؟
بالنسبة لـ JSONB والمصفوفات والبحث عن النص الكامل. للحصول على مساواة بسيطة في الأعمدة العددية، تعتبر B-tree أرخص وأكثر ملاءمة.
لماذا لا أزال أرى عمليات المسح التسلسلي بعد الفهرسة؟
قد يكون الجدول صغيرًا، أو المسند غير قابل للتبديل، أو الإحصائيات قديمة، أو الانتقائية منخفضة جدًا. أعد التحقق من شرح التحليل باستخدام مرشحات حقيقية.
المعرفة والمقالات
تحتاج تطبيق هذه المفاهيم في منتجك؟
بارادايس كود معك من الاستشارة حتى التسليم الكامل.
مقالات ذات صلة
هندسة الخلفية·١٥ دقيقة قراءة
إمكانية ملاحظة الإنتاج: السجلات والمقاييس والآثار التي تصحح الأخطاء فعليًا
هندسة الخلفية·١٢ دقيقة قراءة
إصدار واجهة برمجة التطبيقات (API) والتوافق مع الإصدارات السابقة: العقود التي لا تؤدي إلى كسر العملاء
هندسة الخلفية·١٦ دقيقة قراءة