پایگاه داده (Database) یکی از بخشهای حیاتی هر وبسایت است. اگر میخواهید وبسایتهایی بهینه و با ساختاری اصولی بسازید، اصول کوئرینویسی (فراخوانی دادهها) را درک کنید و حتی بدانید کدام قالبها و افزونهها برای هر پروژه مناسبتر هستند، شناخت مفاهیم پایه دیتابیس وردپرس و نحوه کارکرد آن بسیار راهگشا خواهد بود. پایگاه داده وردپرس هر از گاهی به بهینه سازی نیاز دارد. در این مقاله به طور کامل نحوه بهینه سازی دیتابیس وردپرس توضیح داده می شود.

تصویر(1)
دیتابیس وردپرس چیست؟
برای درک بهتر مفهوم کلی یک وبسایت وردپرسی، میتوان ساختار آن را به صورت ساده بررسی کرد. هر وبسایت وردپرسی از دو بخش اصلی تشکیل شده است:
- فایلهای فیزیکی (JS ،CSS ،PHP): تنظیمات، ظاهر و نحوه نمایش سایت را تعیین میکنند. میتوانید آنها را از طریق یک کلاینت FTP مشاهده و ویرایش کنید.
- پایگاه داده (Database): محتوا، اطلاعات کاربران، ارتباطات و سایر دادهها را ذخیره میکند. برای مشاهده و ویرایش آن میتوانید از ابزارهای مختلفی استفاده کنید که یکی از محبوبترین آنها phpMyAdmin است.
هر بار که کاربری وبسایت را باز میکند، اتصالی با پایگاه داده برقرار شده و درخواستهایی (Query) ارسال میشود. سپس مرورگر محتوا را پردازش کرده و صفحه درخواستی را به کاربر نشان میدهد. بنابراین، هیچ وبسایت وردپرسی بدون پایگاه داده نمیتواند وجود داشته باشد. وردپرس از یک سیستم مدیریت پایگاه داده متنباز به نام MySQL استفاده میکند.
ساختار دیتابیس وردپرس
پیش از راهاندازی وبسایت، پایگاه داده وردپرس باید ساخته شود. نام پایگاه داده، نام کاربری و رمز عبور را میتوان در فایل wp-config.php پیدا کرد؛ بدون این اطلاعات، هیچ اتصالی به دیتابیس وردپرس برقرار نخواهد شد.
به صورت پیشفرض ۱۲ جدول (Table) در دیتابیس وردپرس برای شکلدهی ساختار اصلی وجود دارد و با نصب افزونهها، جداول بیشتری نیز به آن اضافه میشود. در ادامه لیست جداول هسته وردپرس آمده است:

تصویر(2)
-
wp_posts: جدول مرکزی که تمام انواع پستها (نوشتهها، برگهها، منوها، پیشنویسها/بازبینیها و...) را ذخیره میکند. این جدول مسئول بخش عمدهای از محتوای سایت است.
-
wp_users: برای نگهداری اطلاعات کاربران ثبتنامشده (نام کاربری، رمز عبور، نام مستعار و...).
-
wp_comments: برای ذخیره دیدگاهها (کامنتها).
-
wp_postmeta: متادادههای نوشتهها (دادههای حاصل از فیلدهای متاداده) را نگهداری میکند.
-
wp_usermeta: متادادههای مربوط به کاربران را نگهداری مینماید.
-
wp_commentmeta: متادادههای مربوط به دیدگاهها را نگهداری میکند.
-
wp_terms: دادههای مربوط به تاکسونومیها (نام دستهبندیها، برچسبها، تاکسونومیهای سفارشی، شناسه/ID و نامک/Slug آنها) را ذخیره مینماید.
-
wp_termmeta: متادادههای مربوط به تاکسونومیها را ذخیره میکند.
-
wp_term_taxonomy: تاکسونومیها را توصیف کرده و اطلاعات ساختاری آنها را نگهداری مینماید.
-
wp_term_relationships: مسئول ایجاد ارتباط بین پستها و تاکسونومیهایی است که به آنها تعلق دارند.
-
wp_options: اطلاعات تنظیمات سراسری، گزینه های مختلف، ویجتها و سایر دادههای کلی سایت را ذخیره میکند.
-
wp_links: اطلاعات لینکها مربوط به قابلیت قدیمی Link (که منسوخ شده) را ذخیره مینماید. به همین دلیل معمولاً این جدول خالی میماند.
هر جدول دارای مجموعهای از ستونها (فیلدها) با انواع مشخص (مانند متن، تاریخ/زمان، varchar و...) و سطرها (Rows) است. تعداد سطرها به حجم محتوای وبسایت بستگی دارد.
جداول پایگاه داده وردپرس به کمک کلیدها با یکدیگر در ارتباط هستند (که در ادامه درباره آنها توضیح داده می شود). تصویر زیر، ساختاری از جداول وردپرس است و مسلماً اگر جداول بیشتری هم اضافه شوند، آنها نیز به یکدیگر متصل خواهند شد:

تصویر(3)
نکاتی که جهت درک بهتر دیتابیس وردپرس باید در نظر داشته باشید:
- جدول wp_term_relationships برای افزودن دادههای جدید نیست؛ بلکه نقش رابط میان نوشتهها و تاکسونومیها را ایفا میکند. زیرا رابطه آنها از نوع «چند به چند» (Many-to-Many) است (مثلاً یک نوشته میتواند متعلق به چند دسته باشد و هر دسته میتواند شامل چندین نوشته شود). بنابراین به چنین واسطهای برای ایجاد جفتهای صحیح نیاز است.

تصویر(4)
- فایلهای رسانهای در پایگاه داده ذخیره نمیشوند؛ بلکه در پوشه wp-content > uploads قرار میگیرند. اما رکوردهای مربوط به آنها و متادادههایشان در دیتابیس وردپرس (عمدتاً جدول wp_postmeta) ذخیره میشوند.
- فیلدهای متاداده پنهان زیادی در هر نوشته وجود دارند که اسم آنها با _ شروع میشود و نباید به صورت دستی ویرایش شوند. بنابراین، اگر فیلدهای متاداده را در نوشتههای خود نمیبینید، به این معنی نیست که وجود ندارند. در مقابل، فیلدهای سفارشی (Custom Fields) که خودتان اضافه میکنید تا به صورت دستی ویرایش شوند و اطلاعات تکمیلی را نگهداری کنند، مشخصاً قابل مشاهده خواهند بود.
کلیدهای پایگاه داده (Database Keys)
جداول دیتابیس وردپرس بر اساس اصل روابط و توسط کلیدها به هم متصل میشوند. دو نوع کلید اصلی وجود دارد که به ساخت این ارتباطات کمک میکنند:
- کلید اصلی (Primary Key)
- کلید خارجی (Foreign Key)
کلید اصلی، یک رکورد منحصر به فرد در پایگاه داده است که در جدول دیگری به عنوان مرجع (کلید خارجی) استفاده میشود. معمولاً شناسه یا همان ID ها نقش کلید را ایفا میکنند.

تصویر(5)
برای مثال، دو جدول wp_users و wp_posts را در نظر بگیرید. در جدول اول کاربر John دارای ID=3 می باشد. این یک کلید اصلی است. حال به جدول wp_posts نگاه کنید. در ستون post_author عدد 3 را مشاهده می نمایید که به شناسه کاربر ID=3 اشاره دارد و این یعنی John نویسنده پستهای با شناسه 9، 10 و 14 است. این ستون نقش کلید خارجی را ایفا میکند و به کلید اصلی در جدول دیگر اشاره دارد.

تصویر(6)
چرا جدول wp_posts به جدول wp_users اشاره میکند و برعکس آن وجود ندارد؟
زیرا جدول wp_users با جدول wp_posts رابطه یک به چند (One-to-Many) دارد؛ هر کاربر میتواند چندین نوشته ایجاد کند اما یک نوشته نمیتواند چند نویسنده (کاربر) داشته باشد.
نکته: فراموش نکنید که وقتی یک نوشته اضافه مینمایید، دو رکورد در پایگاه داده ایجاد میشود که شامل نوشته اصلی و یک نسخه بازبینی (که مقدار ستون post_type آن revision است) خواهد بود. به همین دلیل، تعداد ID ها بسیار بیشتر از کل تعداد نوشتههای سایت می باشد. بنابراین اگر دو ورودی با محتوای یکسان یا مشابه دیدید سردرگم نشوید. همچنین هر بار که نوشته را ویرایش میکنید، یک نسخه بازبینی دیگر اضافه میشود.
از طرف دیگر، جدول wp_posts با جدول wp_postmeta رابطه یک به چند دارد. اگر پستی با شناسه ID=10 را از جدول اول (کلید اصلی) بردارید و به جدول wp_postmeta بروید، آن را در ستون post_id (کلید خارجی) همراه متادادههای متعلق به آن پست پیدا خواهید کرد.

تصویر(7)
چنین ساختاری در طراحی پایگاه داده رابطهای، به کاهش چشمگیر حجم دیتابیس وردپرس کمک میکند (زیرا نیازی به وارد کردن اطلاعات تکراری در هر جدول نیست) و باعث حفظ یکپارچگی دادهها، امنیت، مقیاسپذیری و در مجموع، عملکرد سریعتر و کارآمدتر آن میشود.
چرا باید دیتابیس وردپرس را بهینه سازی کرد؟
شایعترین مشکلی که برای پایگاه داده پیش میآید، بزرگ و سنگین شدن است که لزوماً به دلیل افزودن محتوای زیاد رخ می دهد. این امر باعث کند شدن وبسایت میشود زیرا برای پیمایش تمام رکوردهای دیتابیس و یافتن اطلاعات درخواستی به زمان بیشتری نیاز است.
نکته مهم: قبل انجام هرگونه بهینه سازی در پایگاه داده، حتماً از وبسایت خود (به ویژه دیتابیس) نسخه پشتیبان (بکآپ) تهیه نمایید.
چه چیزهایی دیتابیس وردپرس را سنگین میکنند و چگونه باید آنها را پاک کنید؟
۱. بازبینیها (Revisions)
وردپرس نسخههای پیشین نوشتهها را ذخیره میکند؛ میتوانید تعداد آنها را در پنل سمت راست هر نوشته ببینید، آنها را باز کرده و هر کدام را بازگردانی کنید.

تصویر(8)
به صورت پیشفرض، تعداد نسخههای بازبینی ذخیرهشده محدود نیست. تصور کنید چه تعداد رکورد اضافی در دیتابیس وردپرس ایجاد شده و چقدر آن را حجیم میکند. برای حل این مشکل باید دو کار انجام داد:
- محدود کردن تعداد بازبینیهایی که وردپرس ذخیره میکند.
- حذف بازبینیهای قدیمی.
برای محدود کردن تعداد بازبینیها، کد زیر را به فایل wp-config.php (واقع در پوشه اصلی سایت) اضافه کنید:
define( 'WP_POST_REVISIONS', 5 );
در این مثال، عدد «5» حداکثر تعداد بازبینیهایی است که میخواهید نگهداری شوند. میتوانید عددی را که برای سایت شما مناسبتر است وارد کنید اما اگر میخواهید قابلیت بازبینی را به طور کامل غیرفعال نمایید، کد زیر را جایگزین کنید:
define( 'WP_POST_REVISIONS', false );
بهترین راه برای حذف بازبینیها، استفاده از افزونههای بهینه سازی پایگاه داده است. معمولاً این افزونهها حق انتخاب میدهند که چه تعداد از آنها حذف شوند اما میتوانید مستقیماً با اجرای کوئری SQL زیر در phpMyAdmin یا ابزارهای مشابه نیز این کار را انجام دهید (تمام بازبینیها حذف خواهند شد):
DELETE FROM wp_posts WHERE post_type = "revision";
۲. دیدگاههای اسپم و زبالهدان
برای تمیز و مرتب نگه داشتن پایگاه داده، حذف دیدگاههای زبالهدان و اسپم را فراموش نکنید. این کار از طریق بخش «دیدگاهها» در پیشخوان وردپرس بسیار آسان است. همچنین حتماً بخش تنظیمات > گفتگو را بررسی کنید تا قوانین نظارت بر دیدگاهها و کلمات غیرمجاز را تنظیم نمایید.
۳. نوشتهها و پیشنویسهای موجود در زبالهدان
بررسی فهرست نوشتهها و برگهها برای پیدا کردن پیشنویسهای فراموششده، مفید است. علاوه بر این، نوشتههایی در زبالهدان وجود دارند که میتوان به جای صبر کردن ۳۰ روزه برای حذف خودکار توسط وردپرس، آنها را دستی و دائمی حذف کرد. همچنین میتوانید کد زیر را به فایل wp-config.php اضافه کنید تا زمان خالی شدن زبالهدان تعیین شود (در این مثال عدد "4" یعنی نوشتهها ۴ روز درون زبالهدان میمانند و سپس حذف میشوند):
define( 'EMPTY_TRASH_DAYS', 4 );
۴. ترنزینتها (Transients)
ترنزینتها دادههای موقتی مربوط به تنظیمات دارای تاریخ انقضا هستند اما به طور خودکار پاک نمیشوند. بنابراین پاکسازی دورهای آنها مهم است، به خصوص اگر افزونههای زیادی دارید. این دادهها جدول wp_options را سنگین میکنند. بهترین روش برای حذف آنها استفاده از افزونههای بهینه سازی است.
۵. رکوردهای معلق یا یتیم (Orphaned Records)
رکوردهای معلق، رکوردهایی هستند که کلیدهای خارجی آنها به کلیدهای اصلیِ غیرموجود اشاره میکنند. این رکوردها دیتابیس وردپرس را آلوده خواهند کرد، بنابراین باید حذف شوند. باز هم سادهترین راه، استفاده از افزونهای است که این کار را برایتان انجام دهد.
ترمیم و بهینه سازی پایگاه داده
دو روش اصلی برای بهبود عملکرد پایگاه داده وجود دارد:
- بهینه سازی (Optimizing)
- ترمیم (Repairing)
این کار را میتوان با استفاده از افزونههای بهینه سازی عملکرد یا به صورت دستی با نوشتن دستور WP-CLI یا کوئری SQL انجام داد:
OPTIMIZE TABLE table_name;
این دستور، "یکپارچهسازی" (Defragmentation) جدول را آغاز میکند که در واقع بازسازی و سازماندهی مجدد تمام ارتباطات از ابتدا است.
بهینه سازی پایگاه داده در مواقع زیر ضروری خواهد بود:
- پایگاه داده درست کار نمیکند و پردازش درخواستها بیش از حد طول میکشد یا اصلاً کار نمیکند.
- حجم پایگاه داده بسیار بزرگتر از حد معمول شده است.
- رفتارهای مشکوک دیگری در دیتابیس دیده میشود (این اتفاق معمولاً بعد از انتقال سایت/مهاجرت نیز رخ میدهد).
اگر با چنین مواردی مواجه شدید، از سایت خود پشتیبان گرفته و بهینه سازی دیتابیس وردپرس را اجرا کنید.
وردپرس اسکریپت ویژهای برای این کار دارد اما ابتدا باید با افزودن کد زیر به فایل wp-config.php مجوز استفاده از آن را صادر کنید:
const WP_ALLOW_REPAIR = true;
یا:
define( 'WP_ALLOW_REPAIR', true );
سپس از آدرس زیر در مرورگر استفاده کنید (آدرس سایت خود را جایگزین نمایید):
https://example.com/wp-admin/maint/repair.php
با وارد کردن این آدرس، صفحهای جهت ترمیم و بهینه سازی دیتابیس وردپرس برای شما نمایش داده میشود.

تصویر(9)
جمعبندی
دیتابیس وردپرس ممکن است بهدلیل دادههای زائد، افزونهها، معماری سایت یا مهاجرت بین هاستها حجیم و ناکارآمد شود. حجم کم دیتابیس لزوماً به معنای اهمیت پایین آن در عملکرد وب سایت نیست؛ زیرا وبسایت هنگام بارگذاری صفحات، درخواستهای متعددی برای دریافت اطلاعات از پایگاه داده ارسال میکند. بنابراین، بهینه سازی و مدیریت صحیح دیتابیس وردپرس برای افزایش سرعت و عملکرد سایت ضروری است. استفاده از افزونههای مناسب میتواند این فرایند را ساده کند اما قبل هرگونه تغییر باید از پایگاه داده نسخه پشتیبان تهیه کرد؛ زیرا تنظیمات نادرست ممکن است به ساختار و عملکرد کل وبسایت آسیب برساند.