آموزش

پاک‌سازی دیتابیس وردپرس؛ کاهش حجم تا ۸۰٪ با کوئری واقعی

ریویژن‌ها، ترنزینت‌ها و متاهای یتیم حجم دیتابیس وردپرس را بی‌صدا می‌خورند. با کوئری‌های دقیق و بدون افزونه، دیتابیس را تمیز کنید و سایت را سبک‌تر کنید.

آموزش

دیتابیس وردپرس شما ۴۰۰ مگابایت است و سایت فقط ۲ مگابایت محتوا دارد

این صحنه را می‌شناسید: از phpMyAdmin یک نگاه به جدول wp_options می‌اندازید و چشم‌تان به عدد 350,000 ردیف می‌افتد. یا wp_postmeta را باز می‌کنید و ۱۲۰ هزار ردیف می‌بینید، در حالی که فقط ۳۰۰ نوشته دارید. بکاپ‌گیری از دیتابیس ۱۰ دقیقه طول می‌کشد، صفحه‌های مدیریت وردپرس کند شده و هر بار که افزونه‌ای را نصب می‌کنید، انگار سایت نفس‌اش بند می‌آید.

مشکل از خود وردپرس نیست. مشکل از چیزهایی است که وردپرس و افزونه‌ها در طول سال‌ها بی‌صدا در دیتابیس انباشته کرده‌اند. خبر خوب این است که بیشتر این حجم را می‌شود با چند کوئری ساده حذف کرد. بدون افزونه، بدون ریسک غیرضروری، فقط با SQL خالص.

چهار چیز که حجم دیتابیس وردپرس را می‌خورند

قبل از اینکه کوئری بنویسیم، باید بدانیم با چه چیزی طرف هستیم. چهار منبع اصلی چاقی دیتابیس وردپرس این‌ها هستند:

  • ریویژن‌ها (Revisions) — هر بار که نوشته‌ای را ویرایش می‌کنید، وردپرس یک نسخه کامل از آن را در wp_posts ذخیره می‌کند. ده ویرایش روی یک نوشته یعنی ده ردیف اضافه، هر کدام با کل متن.
  • ترنزینت‌ها (Transients) — کش موقتی که افزونه‌ها و خود وردپرس در wp_options نگه می‌دارند. مشکل اینجاست که خیلی از ترنزینت‌ها بعد از انقضا پاک نمی‌شوند و تا ابد می‌مانند.
  • متاهای یتیم (Orphaned Meta) — وقتی نوشته‌ای را حذف می‌کنید، ردیف‌های مربوط به آن در wp_postmeta باقی می‌مانند. هیچ کوئری‌ای به آن‌ها دسترسی ندارد، اما حجم را اشغال می‌کنند.
  • جدول‌های جامانده از افزونه‌های حذف‌شده — افزونه را پاک می‌کنید، اما جدول‌هایش در دیتابیس می‌مانند. بعضی از این جدول‌ها تا ده‌ها مگابایت حجم دارند.

حالا ببینیم هر کدام را چطور تمیز کنیم.

ریویژن‌ها را با یک کوئری حذف کنید

ساده‌ترین و امن‌ترین جایی که می‌شود شروع کرد، ریویژن‌هاست. این کوئری همه ریویژن‌های غیر از آخرین نسخه هر نوشته را حذف می‌کند:

DELETE FROM wp_posts
WHERE post_type = 'revision'
AND ID NOT IN (
    SELECT MAX(ID) FROM wp_posts
    WHERE post_type = 'revision'
    GROUP BY post_parent
);

اگر می‌خواهید از حالا به بعد ریویژن‌ها اصلاً ساخته نشوند، این خط را به wp-config.php اضافه کنید:

define('WP_POST_REVISIONS', 2);

این تنظیم وردپرس را مجبور می‌کند فقط ۲ نسخه آخر هر نوشته را نگه دارد. عدد صفر یعنی غیرفعال کردن کامل، اما پیشنهاد من عدد ۲ است. چون اگر اشتباهی متنی را پاک کنید و بخواهید برگردانید، یک نسخه قبلی داشته باشید.

ترنزینت‌های منقضی‌شده را پاک کنید

ترنزینت‌ها در wp_options با نام‌هایی مثل _transient_... و _transient_timeout_... ذخیره می‌شوند. کوئری زیر همه ترنزینت‌هایی را که زمان‌شان گذشته حذف می‌کند:

DELETE FROM wp_options
WHERE option_name LIKE '_transient_timeout_%'
AND option_value < UNIX_TIMESTAMP();

بعد از این، باید ردیف‌های متناظر را هم پاک کنید. این کوئری دوم را اجرا کنید:

DELETE o1 FROM wp_options o1
LEFT JOIN wp_options o2
ON o2.option_name = CONCAT('_transient_', SUBSTRING(o1.option_name, 20))
WHERE o1.option_name LIKE '_transient_%'
AND o2.option_id IS NULL;

این‌جا اشتباه می‌کنند: خیلی‌ها کوئری اول را اجرا می‌کنند و فکر می‌کنند کار تمام است. اما ردیف‌های اصلی ترنزینت (بدون timeout) هنوز در جدول می‌مانند. اگر فقط کوئری اول را بزنید، حجم تقریباً نصف می‌شود و چند هفته بعد دوباره همان وضعیت برمی‌گردد. هر دو کوئری را پشت سر هم اجرا کنید.

متاهای یتیم را پیدا و حذف کنید

متاهای یتیم ردیف‌هایی در wp_postmeta هستند که به نوشته‌ای که دیگر وجود ندارد اشاره می‌کنند. این کوئری آن‌ها را حذف می‌کند:

DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON p.ID = pm.post_id
WHERE p.ID IS NULL;

همین الگو را برای wp_commentmeta هم می‌توانید تکرار کنید، اگر دیدید آن جدول هم بزرگ شده است. فقط نام جدول را عوض کنید.

جدول‌های جامانده از افزونه حذف‌شده را شناسایی کنید

این بخش حساسترین کار است. بعضی افزونه‌ها هنگام حذف، جدول‌هایشان را پاک می‌کنند و بعضی نه. برای پیدا کردن جدول‌های اضافه، اول ببینید وردپرس از چه پیشوندی استفاده می‌کند. معمولاً wp_ است، اما بعضی سایت‌ها پیشوند سفارشی دارند. در phpMyAdmin این کوئری را بزنید:

SHOW TABLES LIKE 'wp\_%';

حالا لیست جدول‌های استاندارد وردپرس را کنار بگذارید: wp_posts، wp_postmeta، wp_options، wp_users، wp_usermeta، wp_terms، wp_termmeta، wp_term_taxonomy، wp_term_relationships، wp_comments، wp_commentmeta، wp_links و جدول‌های چندسایته اگر وردپرس شما مولتی‌سایت است. هر جدول دیگری که می‌بینید، یا از افزونه است یا از یک اسکریپت سفارشی.

قبل از حذف هر جدولی، یک جستجوی ساده در گوگل با نام جدول انجام دهید تا ببینید متعلق به کدام افزونه است. اگر افزونه را واقعاً حذف کرده‌اید و به داده‌هایش نیاز ندارید، DROP TABLE بزنید. اما اگر شک دارید، اول یک بکاپ بگیرید. حذف جدول اشتباه یعنی از دست دادن داده‌ای که شاید راهی برای برگرداندنش نباشد.

قبل از هر کاری بکاپ بگیرید، بعد از هر کاری آپتیمایز کنید

این قانون را نشکنید: قبل از اجرای هر کوئری DELETE، یک بکاپ کامل از دیتابیس بگیرید. نه فقط از جدولی که می‌خواهید تمیز کنید، از کل دیتابیس. در phpMyAdmin گزینه Export را بزنید و روش Quick را انتخاب کنید. دو دقیقه وقت می‌گیرد و اگر چیزی اشتباه شد، جان شماست.

بعد از پاک‌سازی، جدول‌ها را آپتیمایز کنید تا فضای آزادشده واقعاً به سرور برگردد. در phpMyAdmin روی نام دیتابیس کلیک کنید، همه جدول‌ها را انتخاب کنید و از منوی کشویی گزینه Optimize Table را بزنید. این کار ایندکس‌ها را بازسازی می‌کند و جدول‌هایی که بعد از حذف ردیف‌های زیاد، تکه‌تکه شده‌اند را مرتب می‌کند.

نکته مهم: اگر سایت شما روی هاست اشتراکی است و دیتابیس بزرگی دارد، اجرای کوئری‌های DELETE ممکن است با خطای 504 Gateway Timeout مواجه شود. در این حالت کوئری را با LIMIT محدود کنید و چند بار اجرا کنید:

DELETE FROM wp_posts
WHERE post_type = 'revision'
LIMIT 1000;

این کوئری را آنقدر اجرا کنید تا بگوید 0 rows affected. بله، کسل‌کننده است. اما امن‌تر از یک کوئری سنگین است که سرور را از کار بیندازد.

این‌جا اشتباه می‌کنند: پلاگین پاک‌سازی دیتابیس را نصب می‌کنند و فراموشش می‌کنند

الگو را بارها دیده‌ام: مدیر سایت یک افزونه پاک‌سازی دیتابیس نصب می‌کند، یک بار اجرا می‌کند، نتیجه را می‌بیند و راضی می‌شود. سه ماه بعد، دیتابیس دوباره همان حجم قبلی را دارد. چون افزونه‌های پاک‌سازی فقط وقتی اجرا شوند کار می‌کنند. اگر کرون جاب (Cron Job) برایشان تنظیم نکنید، همان یک بار اجرا می‌شوند و تمام.

علاوه بر این، هر افزونه‌ای که نصب می‌کنید، خودش یک لایه سنگینی روی دیتابیس می‌آورد. برای پاک‌سازی یک مشکل که با ۵ کوئری ساده حل می‌شود، یک افزونه دائمی نصب کردن، مثل این است که برای تمیز کردن اتاق، یک کارگر تمام‌وقت استخدام کنید که فقط یک روز در ماه کار کند.

راه من این است: یک اسکریپت ساده با کوئری‌های بالا بنویسید و با کرون جاب ماهانه روی سرور اجرا کنید. اگر با هاست لینوکس کار می‌کنید، می‌توانید از crontab استفاده کنید. این کار بدون نیاز به افزونه، به صورت خودکار انجام می‌شود و شما فراموشش می‌کنید.

بعد از پاک‌سازی، مراقب باشید چه چیزی را نصب می‌کنید

دیتابیس تمیز شد و حجمش از ۴۰۰ مگابایت به ۸۰ مگابایت رسید. حالا چه؟ اگر الگوی استفاده شما عوض نشود، شش ماه دیگر دوباره همان وضعیت می‌شود. چند عادت ساده را جدی بگیرید:

  • افزونه‌ای را که آزمایشی نصب کرده‌اید و استفاده نمی‌کنید، همان روز حذف کنید. نه هفته بعد، همان روز.
  • قبل از حذف افزونه، مستنداتش را چک کنید که آیا جدول‌هایش را پاک می‌کند یا نه. اگر پاک نمی‌کند، بعد از حذف، جدول‌ها را با روشی که بالاتر گفتم دستی حذف کنید.
  • برای سایت‌هایی که چند نویسنده دارند، محدودیت ریویژن را حتماً در wp-config.php تنظیم کنید. نویسنده‌ها عادت دارند نوشته را ده بار ویرایش کنند.

اگر سایت شما حجم بالایی از تصاویر و فایل‌های رسانه‌ای دارد، بخش بزرگی از کندی ممکن است از دیتابیس نباشد، بلکه از نبود کش مناسب باشد. در این صورت اول تست سرعت سایت را انجام دهید و ببینید مشکل واقعاً کجاست. پاک‌سازی دیتابیس فقط یکی از ابزارهای بهینه‌سازی است، نه همه آن.

پرسش‌های پرتکرار

آیا حذف ریویژن‌ها به نوشته‌های من آسیب می‌زند؟

خیر. ریویژن‌ها نسخه‌های قبلی نوشته هستند و حذف آن‌ها هیچ تأثیری بر نسخه نهایی که منتشر شده ندارد. تنها چیزی که از دست می‌دهید، امکان بازگشت به نسخه‌های قدیمی‌تر ویرایش است. اگر به تاریخچه ویرایش نیاز دارید، محدودیت را روی ۲ یا ۳ بگذارید، نه صفر.

چطور بفهمم دیتابیس وردپرس من به پاک‌سازی نیاز دارد؟

در phpMyAdmin روی نام دیتابیس کلیک کنید و اندازه کل را ببینید. اگر حجم دیتابیس از حجم کل محتوای سایت (تصاویر و فایل‌ها جدا) بیشتر است، یا اگر تعداد ردیف‌های wp_options از چند ده هزار بیشتر شده، وقت پاک‌سازی است. یک سایت معمولی با ۵۰۰ نوشته نباید دیتابیسی بیشتر از ۵۰ مگابایت داشته باشد.

آیا پاک‌سازی دیتابیس باعث از دست رفتن تنظیمات وردپرس می‌شود؟

نه، اگر فقط ریویژن‌ها، ترنزینت‌های منقضی و متاهای یتیم را حذف کنید. تنظیمات اصلی وردپرس در ردیف‌هایی با نام‌های مشخص مثل siteurl یا blogname در wp_options ذخیره شده‌اند و کوئری‌های بالا به آن‌ها دست نمی‌زنند. فقط مراقب باشید کوئری‌ای ننویسید که کل جدول wp_options را خالی کند.

بعد از پاک‌سازی دیتابیس، سایت سریع‌تر می‌شود؟

بستگی دارد. اگر کندی سایت از دیتابیس سنگین بود، بله، تفاوت محسوس خواهد بود. اما اگر مشکل از نبود کش، تصاویر سنگین یا هاست ضعیف باشد، پاک‌سازی دیتابیس معجزه نمی‌کند. برای تشخیص دقیق، اول منبع کندی را پیدا کنید. اگر دیتابیس روی هاستی با منابع محدود اجرا می‌شود و حجم آن زیاد است، شاید وقت آن رسیده که به هاست وردپرس با منابع بالاتر فکر کنید.

پشتیبانی سرورنت

تیم فنی و تحریریه‌ی سرورنت — تخصص در زیرساخت، شبکه و میزبانی وب.

هاست وردپرس
اشتراک‌گذاری:

دیدگاه‌ها ۰

هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!

دیدگاه خود را بنویسید

سرویس مرتبط

هاست وردپرس

استک اختصاصی وردپرس با LiteSpeed Enterprise و NVMe — نصب خودکار، آپدیت امن، استیجینگ و کشی که سایت شما را در صدر نتایج گوگل نگه می‌دارد.