الإجابة السريعة

قاعدة البيانات هي القلب الذي ينبض في كل تحميل صفحة على موقع ووردبريس؛ فكل زيارة تُطلق عشرات الاستعلامات لجلب المنشورات والإعدادات والقوائم. مع الوقت تتضخّم القاعدة بمراجعات لا حصر لها، وtransients منتهية الصلاحية، وتعليقات سبام، وجداول يتيمة خلّفتها إضافات محذوفة — فيرتفع زمن الاستجابة الأول (TTFB) ويتباطأ الموقع. الحلّ ليس واحدًا بل طبقات: تنظيف آمن (بعد نسخة احتياطية دائمًا)، وإضافة فهارس (Indexes) للاستعلامات المتكرّرة، وتشغيل OPTIMIZE TABLE لاستعادة المساحة، واستخدام كاش الكائنات عبر Redis لتقليل ضرب القاعدة، ورصد الاستعلامات البطيئة وضبطها. في هذا الدليل أوامر SQL وWP-CLI جاهزة وجداول مرجعية لكل خطوة.

قبل أي شيء، ضع هذه القاعدة الذهبية نصب عينيك: لا تحذف صفًّا واحدًا من قاعدة البيانات قبل أخذ نسخة احتياطية كاملة قابلة للاستعادة. خطأ واحد في عبارة DELETE بلا شرط WHERE صحيح قد يمحو محتوى سنوات في ثوانٍ. القاعدة ليست ملفًا تتلاعب به بحرية، بل هي موقعك كلّه. وللاطّلاع على الصورة الأشمل لتسريع موقعك راجع الدليل الشامل لتسريع موقعك، فتحسين القاعدة جزء من منظومة أكبر لا حلٌّ سحري منفرد.

لماذا تبطئ قاعدة البيانات موقعك أصلًا؟

كل صفحة في ووردبريس ليست ملفًا جاهزًا على القرص يُسلَّم كما هو؛ بل تُبنى ديناميكيًا في كل زيارة. عند طلب صفحة، يشغّل ووردبريس شيفرة PHP تطلق سلسلة استعلامات SQL: من أنت؟ ما إعدادات الموقع؟ ما القائمة؟ ما المنشور المطلوب؟ ما تعليقاته؟ ما الإضافات المفعّلة وإعداداتها؟ صفحة بسيطة قد تطلق 20–40 استعلامًا، وصفحة متجر WooCommerce ثقيلة قد تتجاوز 200 استعلام. كل استعلام يحتاج وقتًا للوصول للقرص ومعالجة النتيجة وإعادتها.

هنا تظهر المشكلة: حين تكون القاعدة نظيفة وصغيرة ومفهرسة جيدًا، تنتهي هذه الاستعلامات في أجزاء من الألف من الثانية. لكن حين تتضخّم — جدول wp_options فيه عشرات آلاف الصفوف، وwp_posts فيه مراجعات أكثر من المنشورات الحقيقية، وwp_postmeta منتفخ بسجلّات إضافات محذوفة — يصبح كل استعلام أبطأ، ويتراكم البطء فيرتفع TTFB. والنتيجة المباشرة: تأخّر ظهور المحتوى، تدهور مؤشّر LCP، وارتفاع معدّل الارتداد.

تحسين قاعدة البيانات: قاعدة منتفخة بالمراجعات القديمة وtransients المنتهية وتعليقات السبام والجداول اليتيمة وoverhead، تمرّ بإجراءات (تنظيف الزائد، إضافة فهارس، كاش كائنات، OPTIMIZE TABLE) لتصبح قاعدة نظيفة باستعلامات أسرع.تحسين قاعدة بيانات الموقعقبل: منتفخة وبطيئةمراجعات قديمةtransients منتهيةتعليقات سبامجداول يتيمةoverhead للجداولاستعلامات بطيئةالإجراءاتتنظيف الزائدفهارس (Index)كاش كائنات (Redis)OPTIMIZE TABLEبعد: رشيقة وسريعةقاعدة نظيفةاستعلامات أسرعأقلّ بيانات + فهارس + كاش = استعلامات أسرع وصفحات أخفّ
تحسين قاعدة البيانات: حذف الزائد (مراجعات/transients/سبام/جداول يتيمة) + إضافة فهارس + كاش كائنات + OPTIMIZE TABLE ⇒ استعلامات أسرع.

العلاقة بين القاعدة والسرعة ليست خطية بسيطة، بل تتفاقم. استعلام يأخذ 5 ملي ثانية في القاعدة النظيفة قد يأخذ 200 ملي ثانية في قاعدة متضخّمة بلا فهارس، وإذا تكرّر ذلك في 30 استعلامًا لكل صفحة، فالفرق بين موقع يستجيب في 300 ملي ثانية وآخر يتعثّر عند 4 ثوانٍ. لفهم كيف يندرج هذا ضمن طبقات الأداء المختلفة، اطّلع على أنواع الكاش ومتى تستخدم كلًا.

المرحلةحالة القاعدةمتوسّط زمن الاستعلامأثر على TTFB
موقع جديدنظيفة، صغيرة، مفهرسة1–5 ملي ثانيةمنخفض جدًا
بعد سنة استخدامبعض التضخّم، autoload متوسط10–30 ملي ثانيةملحوظ
بعد سنوات + إضافات كثيرةمتضخّمة، جداول يتيمة، بلا فهارس50–300 ملي ثانيةعالٍ جدًا
متجر WooCommerce نشط بلا صيانةpostmeta منتفخ، transients متراكمة100–500 ملي ثانيةحرج

مصادر التضخّم: من أين يأتي الانتفاخ؟

قبل أن تنظّف، افهم ما الذي تنظّفه. تضخّم القاعدة ليس سحرًا بل نتيجة سلوكيات افتراضية في ووردبريس وإضافاته تتراكم بصمت. الجدول التالي يلخّص أبرز مصادر التضخّم وأين تسكن:

المصدرالجدوللماذا يتراكمخطورته
المراجعات (Revisions)wp_postsيحفظ ووردبريس نسخة عند كل تعديل بلا حدّ افتراضيعالية
المسوّدات التلقائية (Auto-drafts)wp_postsحفظ تلقائي كل 60 ثانية أثناء الكتابةمتوسطة
transients منتهيةwp_optionsبيانات مؤقتة لا تُحذف دائمًا بعد انتهائهاعالية
تعليقات السبام والمهملاتwp_commentsتتراكم إن لم تُفرّغ يدويًامتوسطة
الجداول اليتيمة (Orphaned)جداول مستقلةإضافات محذوفة لم تنظّف بياناتهامتوسطة
postmeta يتيمwp_postmetaبيانات وصفية لمنشورات/مراجعات محذوفةعالية
pingbacks وtrackbackswp_commentsإشعارات روابط قديمةمنخفضة
overhead (تجزئة)كل الجداولمساحة محرّرة لم تُستردّ بعد الحذفمتوسطة

المراجعات والمسوّدات التلقائية

عند كل ضغطة "تحديث" لمقال، يخزّن ووردبريس النسخة السابقة كـ"مراجعة" في جدول wp_posts. هذه ميزة رائعة للتراجع، لكن بلا حدّ أقصى افتراضي يمكن أن يتراكم لمقال واحد 50 مراجعة أو أكثر. مع مئات المقالات، تصبح المراجعات أضعاف عدد المنشورات الحقيقية، وكلها تُحمَّل وتُفهرَس مع المحتوى الفعلي.

transients المنتهية

الـtransients آلية تخزين مؤقت داخل القاعدة (في wp_options افتراضيًا). تستخدمها الإضافات لحفظ نتائج عمليات مكلفة (مثل استعلام API خارجي) لفترة محدّدة. المشكلة أنّ ووردبريس لا يحذف الـtransient المنتهي فورًا، بل عند طلبه فقط؛ فالـtransients التي لم يعد أحد يطلبها تبقى في القاعدة إلى الأبد. في المواقع القديمة قد تشكّل آلاف الصفوف في wp_options، وأخطرها ما كان منها autoload = yes.

الجداول اليتيمة و postmeta اليتيم

كثير من الإضافات تنشئ جداول خاصة بها (wp_redirection_logs، wp_yoast_indexable، إلخ). عند حذف الإضافة من لوحة التحكم، غالبًا لا تُحذف جداولها وبياناتها، فتبقى "يتيمة" تشغل مساحة وتُدرَج في أي نسخة احتياطية. كذلك حين تُحذف منشورات أو مراجعات، قد تبقى صفوفها الوصفية في wp_postmeta بلا منشور أب — وهذا من أكثر مصادر الانتفاخ الصامتة.

جداول ووردبريس الأساسية ووظيفة كل منها

لتنظّف بأمان، يجب أن تعرف خريطة قاعدتك. ووردبريس القياسي ينشئ 12 جدولًا (مع البادئة wp_ التي قد تختلف في تثبيتك). إليك الجداول الأساسية ووظائفها:

الجدوليخزّنالسبب الشائع لتضخّمه
wp_postsالمنشورات والصفحات والمراجعات والمرفقاتالمراجعات والمسوّدات التلقائية
wp_postmetaبيانات وصفية للمنشورات (حقول مخصّصة)بيانات يتيمة من إضافات/مراجعات
wp_optionsإعدادات الموقع والإضافات وtransientstransients منتهية + autoload منتفخ
wp_commentsالتعليقاتسبام ومهملات لم تُفرّغ
wp_commentmetaبيانات وصفية للتعليقاتبيانات يتيمة لتعليقات محذوفة
wp_termsالمصطلحات (تصنيفات ووسوم)عادة محدود
wp_term_taxonomyتعريف التصنيف للمصطلحعادة محدود
wp_term_relationshipsربط المنشورات بالمصطلحاتعلاقات يتيمة
wp_termmetaبيانات وصفية للمصطلحاتمحدود
wp_usersالمستخدمونعادة محدود
wp_usermetaبيانات وصفية للمستخدمينبيانات جلسات/إضافات
wp_linksالروابط (ميزة قديمة)غالبًا فارغ

في متاجر WooCommerce أضِف جداول مثل wp_woocommerce_sessions (تنتفخ بسرعة بجلسات الزوّار) وwp_wc_orders وعائلتها. وفي الإضافات الشهيرة تجد جداول مثل wp_actionscheduler_actions التي قد تنفجر إلى ملايين الصفوف إن لم تُنظّف.

خطر autoload في wp_options

من أخطر مصادر البطء وأكثرها إهمالًا هو عمود autoload في جدول wp_options. أي صف فيه autoload = yes يُحمَّل في ذاكرة كل تحميل صفحة بلا استثناء، حتى لو لم تكن تلك الصفحة بحاجة إليه. هذه الإعدادات المُحمَّلة تلقائيًا تشكّل ما يُسمّى "alloptions" — كتلة بيانات واحدة تُجلب من القاعدة في كل طلب.

في موقع صحّي، يجب أن يبقى حجم البيانات المُحمَّلة تلقائيًا أقل من ~800 كيلوبايت إلى 1 ميجابايت. لكن إضافات سيئة السلوك تخزّن بيانات ضخمة بـautoload = yes (سجلّات، كاش، بيانات مؤقتة)، فيتضخّم alloptions إلى عدة ميجابايت تُجلب وتُفكّ في كل زيارة — كارثة على TTFB.

حجم autoload الكلّيالتقييمالإجراء
أقل من 800 كيلوبايتممتازلا شيء
800 كيلوبايت – 1 ميجابايتمقبولراقب
1 – 3 ميجابايتمرتفعافحص أكبر الصفوف ونظّف
أكثر من 3 ميجابايتحرجعالج فورًا، عطّل المسبّب

لفحص أكبر صفوف autoload التي تثقل قاعدتك:

-- إجمالي حجم البيانات المُحمَّلة تلقائيًا (بالكيلوبايت)
SELECT ROUND(SUM(LENGTH(option_value))/1024, 2) AS autoload_kb
FROM wp_options
WHERE autoload = 'yes';

-- أكبر 20 صفًّا مُحمَّلًا تلقائيًا حسب الحجم
SELECT option_name,
       ROUND(LENGTH(option_value)/1024, 2) AS size_kb,
       autoload
FROM wp_options
WHERE autoload = 'yes'
ORDER BY LENGTH(option_value) DESC
LIMIT 20;

إذا وجدت صفًّا ضخمًا لإضافة عطّلتها أو لم تعد تستخدمها، يمكنك تعطيل تحميله التلقائي بدل حذفه (أكثر أمانًا) أو حذفه بعد التأكّد:

-- تعطيل التحميل التلقائي لخيار معيّن (أكثر أمانًا من الحذف)
UPDATE wp_options
SET autoload = 'no'
WHERE option_name = 'اسم_الخيار_الضخم';

-- حذف خيار مؤكّد أنه يتيم/غير مستخدم (بعد نسخة احتياطية)
DELETE FROM wp_options
WHERE option_name = 'اسم_الخيار_اليتيم';

تحذير: لا تعدّل أو تحذف خيارات أساسية لووردبريس (مثل siteurl, home, template, active_plugins) — اقتصر على ما تتأكّد من أنه يخصّ إضافة معطّلة أو بيانات مؤقتة.

التنظيف الآمن: النسخة الاحتياطية أولًا

قبل تشغيل أي عبارة DELETE أو UPDATE، خذ نسخة احتياطية كاملة. هذه ليست توصية بل شرط لا يُتجاوز. النسخة تتيح لك الرجوع لحظة وقوع أي خطأ. للتعمّق في استراتيجية النسخ راجع دليلنا المخصّص لذلك، أمّا الأمر السريع عبر سطر الأوامر فهو:

# نسخة احتياطية كاملة لقاعدة البيانات قبل أي تنظيف
mysqldump -u DB_USER -p DB_NAME > backup_$(date +%F).sql

# للملفات الكبيرة: ضغط فوري لتوفير المساحة
mysqldump -u DB_USER -p DB_NAME | gzip > backup_$(date +%F).sql.gz

# عبر WP-CLI (يأخذ بيانات الاتصال من wp-config تلقائيًا)
wp db export backup_$(date +%F).sql

وللاستعادة عند الحاجة:

# استعادة من النسخة (انتبه: يستبدل القاعدة الحالية)
wp db import backup_2026-06-13.sql

اختبر دائمًا أنّ النسخة قابلة للاستعادة فعلًا على بيئة تجريبية (staging) قبل أن تعتمد عليها. نسخة لم تُختبر استعادتها = لا نسخة.

التنظيف اليدوي بـ SQL

بعد النسخة، يمكنك التنظيف بأوامر SQL مباشرة عبر phpMyAdmin أو سطر الأوامر. ابدأ بالمراجعات:

-- حذف كل المراجعات (Revisions)
DELETE FROM wp_posts WHERE post_type = 'revision';

-- حذف المسوّدات التلقائية (Auto-drafts)
DELETE FROM wp_posts WHERE post_status = 'auto-draft';

-- حذف عناصر سلّة المهملات
DELETE FROM wp_posts WHERE post_status = 'trash';

ثم نظّف الـtransients المنتهية. الـtransients تظهر في wp_options بأسماء تبدأ بـ_transient_ و_transient_timeout_ (والنسخة الموقعية _site_transient_):

-- حذف كل الـtransients (آمن: ووردبريس يعيد بناء ما يحتاجه)
DELETE FROM wp_options WHERE option_name LIKE '\_transient\_%';
DELETE FROM wp_options WHERE option_name LIKE '\_site\_transient\_%';

نظّف بعد ذلك تعليقات السبام والمهملات والـpingbacks:

-- حذف تعليقات السبام والمهملات
DELETE FROM wp_comments WHERE comment_approved = 'spam';
DELETE FROM wp_comments WHERE comment_approved = 'trash';

-- حذف pingbacks و trackbacks
DELETE FROM wp_comments WHERE comment_type IN ('pingback', 'trackback');

أخيرًا، نظّف البيانات الوصفية اليتيمة — وهذا من أهمّ ما يقلّص حجم wp_postmeta وwp_commentmeta:

-- حذف postmeta لمنشورات لم تعد موجودة (يتيم)
DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON p.ID = pm.post_id
WHERE p.ID IS NULL;

-- حذف commentmeta لتعليقات لم تعد موجودة
DELETE cm FROM wp_commentmeta cm
LEFT JOIN wp_comments c ON c.comment_ID = cm.comment_id
WHERE c.comment_ID IS NULL;

-- حذف علاقات المصطلحات اليتيمة
DELETE tr FROM wp_term_relationships tr
LEFT JOIN wp_posts p ON p.ID = tr.object_id
WHERE p.ID IS NULL;

جاهز لإطلاق موقعك على استضافة سريعة؟

خطط استضافة wpressly على أقراص NVMe مع SSL مجاني ودعم عربي — اختر الخطة المناسبة لحجمك وانطلق اليوم.

اكتشف خطط الاستضافة

التنظيف بـ WP-CLI (الأسرع والأكثر أمانًا)

إن كانت لديك صلاحية SSH، فإنّ WP-CLI أسرع وأقل عرضة للخطأ من SQL اليدوي، لأنه يتعامل مع منطق ووردبريس لا مع الصفوف الخام. أوامر التنظيف الأساسية:

# حذف كل الـtransients (المنتهية وغيرها)
wp transient delete --all

# حذف الـtransients المنتهية فقط (أكثر تحفّظًا)
wp transient delete --expired

# تشغيل تحسين كامل للقاعدة (يكافئ OPTIMIZE TABLE لكل الجداول)
wp db optimize

# حذف المراجعات عبر إضافة wp-cli (مثال بإضافة معروفة)
wp post delete $(wp post list --post_type='revision' --format=ids) --force

ميزة WP-CLI أنّه يحترم الـhooks والمنطق الداخلي، فلا يترك بيانات وصفية يتيمة كما قد يحدث مع DELETE المباشر على wp_posts وحده.

التنظيف بالإضافات

إن لم تكن مرتاحًا مع SQL أو سطر الأوامر، فإضافات التنظيف توفّر واجهة رسومية آمنة نسبيًا. الجدول يقارن أشهرها:

الإضافةتنظيف المراجعاتtransientsOPTIMIZEجدولة تلقائيةملاحظة
WP-Optimizeنعمنعمنعمنعمشامل + كاش صفحات
Advanced Database Cleanerنعمنعمنعمنعميكتشف الجداول اليتيمة جيدًا
WP-Sweepنعمنعمنعملايستخدم دوال ووردبريس (آمن)
Perfmattersجزئينعملانعميركّز على تقليل autoload

نصيحة: حتى مع الإضافات، خذ نسخة احتياطية قبل أوّل عملية تنظيف، وراجع تقرير ما سيُحذف قبل التأكيد. وبعد انتهاء التنظيف، يُفضَّل تعطيل إضافة التنظيف وعدم تركها مفعّلة دائمًا — فعّلها للصيانة الدورية فقط لتقليل الحمل.

الفهارس (Indexes): تسريع البحث في القاعدة

تخيّل كتابًا بلا فهرس: للعثور على كلمة تقلّب كل الصفحات. الفهرس في قاعدة البيانات يعمل تمامًا كفهرس الكتاب — يتيح لمحرّك القاعدة القفز مباشرة إلى الصفوف المطلوبة بدل مسح الجدول كاملًا (Full Table Scan). على الجداول الكبيرة، الفرق بين استعلام مفهرس وآخر غير مفهرس قد يكون بين ملي ثانية وعدّة ثوانٍ.

ووردبريس يأتي بفهارس افتراضية جيدة على الجداول الأساسية. لكن المشكلة تظهر مع الاستعلامات على wp_postmeta وwp_options حين تبحث الإضافات بقيم meta_key/meta_value غير مفهرسة. أنواع الفهارس الشائعة:

نوع الفهرسيستخدم لـمثال
PRIMARY KEYالمعرّف الفريد للصفID في wp_posts
UNIQUEمنع تكرار القيمةبريد المستخدم
INDEX (عادي)تسريع البحث/الترتيبmeta_key في wp_postmeta
COMPOSITEبحث بأكثر من عمود معًا(post_id, meta_key)
FULLTEXTالبحث النصّيمحتوى المنشورات

متى تضيف فهرسًا؟ حين ترصد استعلامًا بطيئًا يبحث بعمود غير مفهرس ويتكرّر كثيرًا. مثال شائع: إضافة تبحث في wp_postmeta بـmeta_key معيّن على جدول ضخم:

-- فحص استعلام لمعرفة هل يستخدم فهرسًا (ابحث عن type=ALL = مسح كامل)
EXPLAIN SELECT * FROM wp_postmeta WHERE meta_key = 'my_custom_field';

-- إضافة فهرس على meta_key لتسريع بحث الإضافات
ALTER TABLE wp_postmeta ADD INDEX idx_meta_key (meta_key(191));

-- فهرس مركّب لاستعلامات تجمع post_id مع meta_key
ALTER TABLE wp_postmeta
ADD INDEX idx_post_meta (post_id, meta_key(191));

ملاحظة تقنية مهمّة: نستخدم meta_key(191) (فهرس على أول 191 حرفًا) لأنّ ترميز utf8mb4 يحدّ طول مفتاح الفهرس. لا تفرط في إضافة الفهارس: كل فهرس يسرّع القراءة لكنه يبطئ الكتابة ويزيد الحجم. أضِف فهرسًا فقط حين تثبت حاجته بقياس فعلي عبر EXPLAIN.

OPTIMIZE TABLE وإلغاء التجزئة

حين تحذف صفوفًا كثيرة، لا تُستردّ المساحة تلقائيًا؛ تبقى "ثقوب" داخل ملفات الجدول تُسمّى overhead أو تجزئة (fragmentation). الأمر OPTIMIZE TABLE يعيد بناء الجدول فيستردّ المساحة ويعيد ترتيب الفهارس ويحسّن أداء القراءة:

-- فحص حجم الجداول والـ overhead (التجزئة) بالميجابايت
SELECT table_name AS الجدول,
       ROUND(data_length/1024/1024, 2) AS بيانات_MB,
       ROUND(index_length/1024/1024, 2) AS فهارس_MB,
       ROUND(data_free/1024/1024, 2) AS مهدور_MB
FROM information_schema.TABLES
WHERE table_schema = DATABASE()
ORDER BY data_free DESC;

-- تحسين جدول محدّد
OPTIMIZE TABLE wp_postmeta;

-- تحسين أكثر من جدول معًا
OPTIMIZE TABLE wp_posts, wp_postmeta, wp_options, wp_comments;

مهم: على جداول InnoDB (المحرّك الحديث) ينفّذ MySQL داخليًا عملية إعادة بناء كاملة قد تقفل الجدول لحظيًا، لذا شغّله في أوقات الازدحام المنخفض. وعبر WP-CLI يكفي wp db optimize لتحسين كل الجداول دفعة واحدة. لا حاجة لتشغيل OPTIMIZE يوميًا — مرّة شهريًا أو بعد حذف كبير يكفي.

محرّك InnoDB مقابل MyISAM

محرّك التخزين هو الآلية التي تخزّن بها القاعدة بياناتها وتديرها. ووردبريس الحديث يستخدم InnoDB افتراضيًا، لكن مواقع قديمة قد تحتوي جداول عالقة على MyISAM الأقدم. الفرق جوهري للأداء والموثوقية:

المعيارInnoDBMyISAM
القفلعلى مستوى الصف (Row-level)على مستوى الجدول (Table-level)
المعاملات (Transactions)مدعومةغير مدعومة
الاسترداد بعد العطلممتاز (Crash-safe)ضعيف، عرضة للتلف
الأداء مع الكتابة المتزامنةعالٍمنخفض (قفل الجدول كاملًا)
المفاتيح الأجنبيةمدعومةغير مدعومة
الأنسب لـووردبريس الحديث، المتاجرأرشيف قراءة فقط (نادرًا)

قفل الصف في InnoDB هو الفارق الحاسم: في MyISAM، أي كتابة تقفل الجدول كلّه فتنتظر بقية الطلبات؛ أمّا InnoDB فيقفل الصف المعنيّ فقط، ما يسمح بكتابات متزامنة — حيوي للمواقع النشطة والمتاجر. لفحص محرّك جداولك وتحويل أي جدول قديم:

-- فحص محرّك التخزين لكل جدول
SELECT table_name, engine
FROM information_schema.TABLES
WHERE table_schema = DATABASE();

-- تحويل جدول من MyISAM إلى InnoDB (بعد نسخة احتياطية)
ALTER TABLE wp_comments ENGINE = InnoDB;

قبل التحويل تأكّد أنّ نسخة MySQL/MariaDB لديك تدعم InnoDB (وهو الافتراضي منذ سنوات)، وأنّ الجدول لا يعتمد على فهارس FULLTEXT خاصة بـMyISAM لم تكن مدعومة في إصدارات قديمة جدًا من InnoDB.

كاش الكائنات (Object Cache) بـ Redis لتقليل ضرب القاعدة

أقوى ترقية أداء بعد التنظيف هي كاش الكائنات الدائم (Persistent Object Cache). افتراضيًا، يخزّن ووردبريس نتائج الاستعلامات في الذاكرة لمدّة الطلب الواحد فقط؛ فبمجرّد انتهاء تحميل الصفحة، تُنسى. الطلب التالي يكرّر نفس الاستعلامات من الصفر. كاش الكائنات الدائم (عبر Redis أو Memcached) يحفظ هذه النتائج في ذاكرة سريعة بين الطلبات، فلا تضرب القاعدة مرارًا بنفس السؤال.

طلب يمرّ عبر طبقات الكاش: المتصفّح ثم CDN/الحافة ثم كاش الصفحة ثم كاش الكائنات وصولًا لقاعدة البيانات؛ الإصابة في أي طبقة تُعيد الردّ فورًا.طبقات الكاش: أين يُلتقَط الطلب؟المتصفّحBrowserالحافة / CDNEdgeكاش الصفحةPageكاش الكائناتObjectقاعدة البياناتOriginإصابة (Hit) في أي طبقة ⟸ ردّ فوري دون إكمال الرحلة
طبقات الكاش بالترتيب: كلّما أُصيب الطلب في طبقة أبكر (أقصى اليمين) عاد الردّ أسرع دون الوصول لقاعدة البيانات.

الفرق هائل في لوحة الإدارة والمتاجر والصفحات الديناميكية التي لا يفيدها كاش الصفحات الكامل. لفهم كيف يندرج كاش الكائنات ضمن طبقات الكاش المختلفة (المتصفّح، الصفحة، الكائنات، Opcode) راجع أنواع الكاش ومتى تستخدم كلًا. تفعيل Redis يتمّ عادة بإضافة مثل Redis Object Cache بعد تثبيت خادم Redis، ثم تفعيله في wp-config.php:

// في wp-config.php — إعداد اتصال Redis
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_DATABASE', 0 );

// مهلة الاتصال (ثوانٍ) لتجنّب التعليق لو توقّف Redis
define( 'WP_REDIS_TIMEOUT', 1 );
define( 'WP_REDIS_READ_TIMEOUT', 1 );

// بادئة مفاتيح فريدة (مفيد عند مشاركة Redis بين مواقع)
define( 'WP_CACHE_KEY_SALT', 'mysite_' );
الطبقةيخزّنيقلّل ضرب القاعدة؟الأنسب لـ
كاش الصفحةHTML كاملنعم (للزوّار)المحتوى الثابت
كاش الكائنات (Redis)نتائج الاستعلاماتنعم (لوحة + ديناميكي)المتاجر والمواقع النشطة
كاش Opcode (OPcache)شيفرة PHP المُجمَّعةلا (يسرّع PHP)كل المواقع

ملاحظة: يحتاج Redis إلى خادم يدعمه (VPS أو استضافة مُدارة توفّره). كثير من خطط الاستضافة المشتركة الرخيصة لا توفّر Redis، وهذا أحد أسباب اختيار استضافة جادّة للمواقع النشطة.

جاهز لإطلاق موقعك على استضافة سريعة؟

خطط استضافة wpressly على أقراص NVMe مع SSL مجاني ودعم عربي — اختر الخطة المناسبة لحجمك وانطلق اليوم.

اكتشف خطط الاستضافة

رصد الاستعلامات البطيئة وضبطها

لا تحسّن ما لا تقيس. قبل أن تضيف فهرسًا أو تعيد كتابة استعلام، يجب أن تعرف أيّ الاستعلامات بطيئة فعلًا. أداتان رئيسيتان: سجلّ الاستعلامات البطيئة على مستوى MySQL، وإضافة Query Monitor على مستوى ووردبريس.

تفعيل سجلّ الاستعلامات البطيئة (Slow Query Log)

سجلّ الاستعلامات البطيئة يسجّل كل استعلام يتجاوز زمنًا تحدّده. يمكن تفعيله مؤقتًا دون إعادة تشغيل الخادم:

-- تفعيل سجلّ الاستعلامات البطيئة (مؤقت حتى إعادة التشغيل)
SET GLOBAL slow_query_log = 'ON';

-- تسجيل أي استعلام يتجاوز ثانيتين
SET GLOBAL long_query_time = 2;

-- مسار ملف السجلّ
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

-- تسجيل الاستعلامات التي لا تستخدم فهرسًا (مفيد للتشخيص)
SET GLOBAL log_queries_not_using_indexes = 'ON';

لتفعيله دائمًا، أضِف ما يلي في ملف إعداد MySQL (my.cnf أو mysqld.cnf):

# في قسم [mysqld] من my.cnf
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

ثم استخدم أداة مثل mysqldumpslow لتلخيص أكثر الاستعلامات بطئًا وتكرارًا:

# تلخيص أبطأ 10 استعلامات حسب متوسّط الزمن
mysqldumpslow -s at -t 10 /var/log/mysql/slow.log

Query Monitor داخل ووردبريس

إضافة Query Monitor المجانية تعرض — لكل صفحة تزورها وأنت مسجّل دخول كمدير — كل الاستعلامات وزمنها والإضافة المسؤولة عنها والاستعلامات المكرّرة. هذا أسرع طريقة لربط الاستعلام البطيء بمصدره: قد تكتشف أنّ إضافة واحدة مسؤولة عن نصف زمن القاعدة، فتستبدلها أو تعطّلها.

الأداةالمستوىيكشفالأنسب لـ
Slow Query LogMySQLالاستعلامات البطيئة عبر الموقع كلهتشخيص الخادم
Query Monitorووردبريساستعلامات الصفحة + مصدرهاربط الاستعلام بالإضافة
EXPLAINSQLخطة تنفيذ استعلام واحدتأكيد استخدام الفهرس
New Relic / APMالخادمالأداء عبر الزمنالمواقع الكبيرة

ضبط ووردبريس لمنع التضخّم من الأصل

التنظيف علاج، لكن الوقاية أفضل. بضعة ثوابت في wp-config.php تمنع تراكم المراجعات والحفظ التلقائي المفرط من البداية:

// تحديد عدد المراجعات المحفوظة لكل منشور (مثلاً 5 فقط)
define( 'WP_POST_REVISIONS', 5 );

// أو تعطيل المراجعات تمامًا (غير مستحسن لمواقع فيها تحرير كثير)
// define( 'WP_POST_REVISIONS', false );

// إطالة فترة الحفظ التلقائي إلى 120 ثانية (الافتراضي 60)
define( 'AUTOSAVE_INTERVAL', 120 );

// تفريغ سلّة المهملات تلقائيًا كل 7 أيام (الافتراضي 30)
define( 'EMPTY_TRASH_DAYS', 7 );

ضع هذه الثوابت قبل سطر /* That's all, stop editing! */ في wp-config.php. الحدّ من المراجعات إلى 5 يوازن بين الأمان (تستطيع التراجع) وعدم الانتفاخ. تذكّر أنّ هذه الإعدادات تؤثّر على المنشورات الجديدة وتعديلاتها فقط؛ المراجعات القديمة المتراكمة تحتاج تنظيفًا يدويًا كما سبق.

الصيانة الدورية: جدول زمني عملي

تحسين القاعدة ليس حدثًا لمرّة واحدة بل عادة. الجدول التالي يقترح روتينًا واقعيًا حسب نوع الموقع:

المهمّةمدوّنة/موقع تعريفيمتجر WooCommerce نشط
نسخة احتياطية كاملةيوميةكل 6 ساعات أو يومية
حذف المراجعات والمسوّداتشهريًاأسبوعيًا
حذف transients منتهيةشهريًاأسبوعيًا
تفريغ سبام التعليقاتأسبوعيًاأسبوعيًا
OPTIMIZE TABLE / wp db optimizeشهريًاشهريًا
فحص حجم autoloadكل 3 أشهرشهريًا
مراجعة الجداول اليتيمةبعد كل حذف إضافةبعد كل حذف إضافة
مراجعة سجلّ الاستعلامات البطيئةعند ملاحظة بطءشهريًا

يمكن أتمتة معظم هذه المهام عبر إضافة جدولة (WP-Optimize تدعم الجدولة) أو عبر cron job على الخادم يستدعي أوامر WP-CLI تلقائيًا. الأتمتة تضمن الاستمرارية بدل الاعتماد على التذكّر اليدوي.

أخطاء شائعة احذرها

كثير من المواقع تتضرّر من "تحسين" خاطئ أكثر مما تتضرّر من الإهمال. تجنّب هذه الأخطاء:

الخطألماذا خطيرالصواب
الحذف بلا نسخة احتياطيةخطأ واحد = فقدان دائمنسخة كاملة مختبَرة أولًا
DELETE بلا WHERE دقيقيمسح أكثر مما تقصدراجع العبارة، جرّبها على staging
تعطيل المراجعات تمامًاتفقد القدرة على التراجعحدّدها بـ 3–5 لا صفر
الإفراط في الفهارسيبطئ الكتابة ويضخّم الحجمفهرس بعد قياس EXPLAIN فقط
حذف جدول دون التأكّدقد يكون مستخدمًا فعلًاتحقّق من أنه يتيم حقًا
ترك إضافة تنظيف مفعّلة دائمًاحمل دائم على الموقعفعّلها للصيانة فقط
OPTIMIZE في وقت الذروةقد يقفل الجداول لحظيًاشغّله في الازدحام المنخفض

نصائح خبير لقاعدة بيانات صحّية

  • افصل الـstaging عن الإنتاج: جرّب كل تنظيف أو تحويل محرّك على نسخة تجريبية أولًا، خصوصًا التحويلات بـALTER TABLE على جداول ضخمة.
  • راقب الإضافات وقت التثبيت: بعض الإضافات تخزّن بيانات هائلة بـautoload = yes. افحص autoload بعد تثبيت أي إضافة جديدة ثقيلة.
  • نظّف عند حذف الإضافات: قبل حذف أي إضافة، ابحث هل توفّر خيار "حذف البيانات عند الإلغاء"، وإلا فستترك جداول وصفوفًا يتيمة.
  • استخدم WP-CLI للأتمتة: أوامر مثل wp transient delete --expired وwp db optimize مثالية لـcron jobs دورية بلا تدخّل.
  • لا تخلط الأسباب: غيّر شيئًا واحدًا وقِس أثره قبل الانتقال للتالي؛ تطبيق عشر تغييرات دفعة واحدة يخفي ما نفع وما ضرّ.
  • القاعدة جزء من منظومة: قاعدة نظيفة لا تنفع وحدها إن كانت الاستضافة بطيئة أو الكاش معطّلًا. اقرأ تسريع موقع ووردبريس وفهم Core Web Vitals لرؤية الصورة كاملة.

تحسين قاعدة البيانات ليس مهمّة تقنية معزولة بل استثمار مباشر في سرعة موقعك وتجربة زوّاره وترتيبه في البحث. ابدأ بنسخة احتياطية، ثم نظّف الانتفاخ، أضِف الفهارس الضرورية، فعّل كاش الكائنات، وارصد الاستعلامات البطيئة — وحوّل الصيانة إلى عادة دورية لا حملة طارئة. واختر استضافة توفّر لك الأدوات التي يحتاجها هذا كله من SSH وRedis وموارد كافية.

جاهز لإطلاق موقعك على استضافة سريعة؟

خطط استضافة wpressly على أقراص NVMe مع SSL مجاني ودعم عربي — اختر الخطة المناسبة لحجمك وانطلق اليوم.

اكتشف خطط الاستضافة

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

هل تحسين قاعدة البيانات يسرّع موقعي فعلًا؟ نعم، لكن بقدر مساهمة القاعدة في البطء لديك. إن كان TTFB مرتفعًا بسبب استعلامات بطيئة وautoload منتفخ وجداول متضخّمة، فالتنظيف والفهرسة وكاش الكائنات تُحدث فرقًا واضحًا. أمّا إن كان البطء من صور غير مضغوطة أو جافاسكربت ثقيل، فالقاعدة ليست العنق. لذا قِس أولًا أين يضيع الوقت.

كم مرّة يجب أن أنظّف قاعدة البيانات؟ للمدوّنات والمواقع التعريفية: تنظيف شامل شهريًا يكفي عادة. للمتاجر النشطة والمواقع كثيرة المحتوى: أسبوعيًا للمراجعات والـtransients، شهريًا لـOPTIMIZE. الأفضل أتمتة هذه المهام عبر جدولة أو cron بدل الاعتماد على التذكّر.

هل حذف المراجعات (Revisions) آمن؟ نعم، حذف المراجعات لا يؤثّر على المحتوى المنشور؛ المراجعة مجرّد نسخة سابقة محفوظة للتراجع. لكن خذ نسخة احتياطية أولًا كإجراء قياسي، وفكّر في الإبقاء على آخر 3–5 مراجعات لكل منشور بدل حذفها كلها، عبر ثابت WP_POST_REVISIONS.

ما الفرق بين OPTIMIZE TABLE وتنظيف الصفوف؟ تنظيف الصفوف (حذف المراجعات والـtransients) يقلّل عدد البيانات. أمّا OPTIMIZE TABLE فيعيد بناء الجدول ليستردّ المساحة المهدورة (overhead) الناتجة عن الحذف ويعيد ترتيب الفهارس. الترتيب الصحيح: نظّف الصفوف أولًا، ثم شغّل OPTIMIZE لاسترداد المساحة.

هل أحتاج Redis فعلًا لموقعي؟ يعتمد على نوع الموقع. المدوّنة الثابتة مع كاش صفحات جيّد قد لا تحتاجه كثيرًا. لكن المتاجر ومواقع العضوية والمنتديات — حيث المحتوى ديناميكي ولا يفيده كاش الصفحات الكامل — يستفيد كثيرًا من كاش الكائنات بـRedis لتقليل ضرب القاعدة. يحتاج Redis استضافة تدعمه (VPS أو مُدارة).

ما هو autoload ولماذا يهمّ؟ autoload عمود في جدول wp_options يحدّد هل يُحمَّل الخيار في ذاكرة كل تحميل صفحة. الإعدادات بـautoload = yes تُجلب جميعها في كل زيارة. إن خزّنت إضافة بيانات ضخمة بـautoload = yes، يتضخّم alloptions ويرتفع TTFB. الصحّي أن يبقى إجمالي autoload أقل من ميجابايت واحد.

هل يمكنني التحسين على استضافة مشتركة بلا SSH؟ نعم. تستطيع التنظيف عبر phpMyAdmin (من لوحة cPanel) بأوامر SQL، أو عبر إضافات مثل WP-Optimize من لوحة ووردبريس. لكن مزايا مثل سجلّ الاستعلامات البطيئة على مستوى الخادم وRedis غالبًا تحتاج VPS أو استضافة مُدارة توفّر هذه الإمكانات.

ماذا أفعل بالجداول اليتيمة من إضافات حذفتها؟ أولًا تأكّد تمامًا أنّ الجدول يتيم حقًا (يخصّ إضافة محذوفة ولا تستخدمه أي إضافة حالية). أدوات مثل Advanced Database Cleaner تكشفها وتساعدك على حذفها بأمان. خذ نسخة احتياطية، ثم احذف الجدول بـDROP TABLE بعد التأكّد. لا تتسرّع — بعض الجداول مشتركة بين إضافات.

هل إضافات التحسين تكفي أم أحتاج SQL يدويًا؟ لمعظم المستخدمين، إضافة موثوقة مثل WP-Optimize أو Advanced Database Cleaner تغطّي 90% من الحاجة بأمان وعبر واجهة رسومية. SQL اليدوي وWP-CLI يمنحان تحكّمًا أدقّ ومناسبان للمحترفين والحالات الخاصة (فهرس مخصّص، استعلام معيّن). الأهمّ في الحالتين: نسخة احتياطية قبل أي حذف.

هل التحسين قد يكسر موقعي؟ إن اتّبعت القواعد، الخطر ضئيل: نسخة احتياطية أولًا، وحذف ما تتأكّد منه فقط، وتجربة التحويلات الكبيرة على staging. المخاطر تأتي من العشوائية: DELETE بلا WHERE دقيق، أو حذف خيارات أساسية لووردبريس، أو حذف جدول مستخدم. التزم بالتنظيف الآمن الموصوف هنا وستكون بأمان.