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
أخطاء الأداء الشائعة
- فهارس زائدة — كل فهرس يبطئ INSERT/UPDATE
- VACUUM معطل — يسبب انتفاخ الجدول
- استعلامات بدون LIMIT — تُرجع ملايين الصفوف
- تحويلات في WHERE — تمنع استخدام الفهارس
- اتصالات غير مغلقة — تستنفد تجمع الاتصالات
الخلاصة
أداء PostgreSQL على نطاق واسع يتطلب: الفهارس الصحيحة، VACUUM منتظم، تحسين الاستعلامات، وتجميع الاتصالات. قس أولاً بـ EXPLAIN ANALYZE، ثم حسّن.