انتقل إلى المحتوى الرئيسي
DevOpsMar 28, 2026

Deep EVM #27: أداء PostgreSQL على نطاق واسع — الفهارس وVACUUM وتحسين الاستعلامات

OS
Open Soft Team

Engineering Team

الفهارس: الأساس

B-tree (الافتراضي)

أفضل لمعظم الحالات: المساواة، النطاقات، الترتيب.

CREATE INDEX idx_articles_published_at ON articles(published_at DESC);
CREATE INDEX idx_articles_locale_slug ON articles(locale, slug);

GIN (للمصفوفات وJSONB)

CREATE INDEX idx_articles_tags ON articles USING gin(tags);
CREATE INDEX idx_articles_metadata ON articles USING gin(metadata jsonb_path_ops);

GiST (للجغرافيا والبحث النصي)

CREATE INDEX idx_locations_coords ON locations USING gist(coordinates);

الفهارس الجزئية

-- فهرس فقط للمقالات المنشورة
CREATE INDEX idx_published_articles ON articles(published_at)
    WHERE published = true;

VACUUM والصفوف الميتة

PostgreSQL يستخدم MVCC — كل تحديث أو حذف يخلق صفاً ميتاً. VACUUM ينظف هذه الصفوف.

-- إعدادات autovacuum المُحسنة
ALTER TABLE articles SET (
    autovacuum_vacuum_scale_factor = 0.01,    -- 1% بدلاً من 20%
    autovacuum_analyze_scale_factor = 0.005,
    autovacuum_vacuum_cost_delay = 2           -- أسرع
);

تحسين الاستعلامات

استخدم EXPLAIN ANALYZE

EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT * FROM articles
WHERE locale = 'ar' AND published = true
ORDER BY published_at DESC
LIMIT 20;

ابحث عن:

  • Seq Scan على جداول كبيرة — يحتاج فهرس
  • Sort — يحتاج فهرس مع ORDER BY
  • Nested Loop مع عدد كبير — قد يحتاج JOIN مختلف

تجنب SELECT *

-- سيء: يقرأ كل الأعمدة بما فيها content_md
SELECT * FROM articles WHERE locale = 'ar';

-- جيد: يقرأ فقط ما تحتاجه
SELECT id, title, slug, excerpt, published_at
FROM articles WHERE locale = 'ar';

Connection Pooling مع PgBouncer

PostgreSQL لديها حد اتصالات. PgBouncer يوفر تجميع اتصالات:

[databases]
opensoft = host=localhost dbname=opensoft

[pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 50

أخطاء الأداء الشائعة

  1. فهارس زائدة — كل فهرس يبطئ INSERT/UPDATE
  2. VACUUM معطل — يسبب انتفاخ الجدول
  3. استعلامات بدون LIMIT — تُرجع ملايين الصفوف
  4. تحويلات في WHERE — تمنع استخدام الفهارس
  5. اتصالات غير مغلقة — تستنفد تجمع الاتصالات

الخلاصة

أداء PostgreSQL على نطاق واسع يتطلب: الفهارس الصحيحة، VACUUM منتظم، تحسين الاستعلامات، وتجميع الاتصالات. قس أولاً بـ EXPLAIN ANALYZE، ثم حسّن.