کوئریهای کند وردپرس از مهمترین دلایلی هست که باعث میشه عملکرد سایت شما را کاهش بده. گاهی اوقات برخی درخواستهای SQL که در دیتابیس برای اجرایی شدن پردازش میشوند به دلیل عملکرد ضعیفی که دارن باعث ایجاد اختلال کلی در سایت میشوند که نتیجه آن چیزی جز کند شدن وردپرس نخواهد بود.
در واقع این کوئریهای دیتابیس در وردپرس زمانی برای خود اسم و رسمی داشته و سریع بودند. اما به مرور زمان با زیاد شدن دادههای سایت و کهولت سنی که در وردپرس رخ میدهد کند و کند و کندتر شدهاند به طوری که دیگر زمانی میرسد قادر به ادامه و همراهی دیتابیس نمیشوند. این درست زمانی است که دیگر عزمتان را برای حل مشکل کند بودن وردپرس به کار خواهید بست.
در این آموزش از دانشنامه کیمیا هاست قصد داریم به معرفی چندین روش مختلف برای یافتن کوئریهای کند در دیتابیس وردپرس بپردازم که باعث شدهاند دیتابیس وردپرس با کندی مواجه شود. البته این موضوع صرفا در این زمان که سایت شما کند شده کاربردی نخواهد بود، بلکه باید در یک بازه زمانی کوتاه چند ماهه مدام کوئریهای دیتابیس وردپرس را بررسی و برطرف کنید تا با مشکل کندی سرعت در وردپرس مواجه نشوید.
پیشنهاد ما: آموزش وردپرس
آموزش جستجو و رفع کوئریهای کند در دیتابیس وردپرس
برای یافتن کوئری کند در وردپرس باید دو مرحله را پشت سر بگذارید.
- شناسایی کوئریهای آهسته در سایت
- پیدا کردن کدهایی که این کوئریها را تولید میکنند
بعد از طی این دو مرحله میتونید مشکل کند بودن وردپرس را با استفاده از کوئریهای کند در دیتابیس وردپرس برطرف کنید. دلیل تهیه این آموزش این است که اسکریپتی در سرورهای هاست میزبانفا استفاده میشود که وظیفه آن بررسی دیتابیس تمامی سایتهای روی سرور است. این اسکریپت Query های دیتابیس سایتهای موجود در سرور را به صورت مرتب مانیتور میکند، سپس با بررسی هر کوئری اگر به جایی پیش برود که اجرای دیتابیس بیش از ۳۰ ثانیه به طول بینجامد اطلاع رسانی انجام خواهد داد. این موضوع باعث مشغول کردن ظرفیت سرور خواهد شد که با زیاد بودن تعداد روی کل سرور تاثیر گذاشته و منجر به کند شدن تمامی سایتهای روی سرور خواهد شد. بنابراین بعد از مشخص شدن این موضوع به کاربر اطلاع رسانی خواهد شد که کوئری مربوط به X در دیتابیس بهینه نیست و باید آن را برطرف نماید. حال در اینجا میتوانید با نحوه شناسایی کوئریهای کند در وردپرس آشنا شوید.
۱. بررسی کوئری وردپرس با Query Monitor
Query Monitor یکی از افزونههای خوب وردپرس است که اطلاعات زیادی در مورد صفحه فعلی که در آن قرار دارید ارائه میدهد. علاوه بر اینکه به مجموعهای از اطلاعات کامل در رابطه با عملکردهای داخلی وردپرس دسترسی دارید، میتوانید از امکانات زیر نیز در آن استفاده کنید.
- چند کوئری و درخواست در صفحه فعلی انجام گرفته است.
- کدام یک از این کوئریهای انجام گرفته از همه طولانیتر هستند.
- کدام یک از توابع وردپرس، بیشترین زمان را در اجرای کوئریهای SQL به خود اختصاص دادهاند.
- کوئریهای نمایش داده شده شامل کدام بخش از وردپرس که شامل هسته وردپرس، قالب وردپرس و افزونه وردپرس است را شامل میشود.
کوئریهایی که دارای بیشترین زمان اجرا در SQL وردپرس باشند توسط این افزونه با رنگ قرمز نمایش داده میشوند که حتما باید به انها توجه داشته باشید و بعد از بررسی مشکل آنها را برطرف کنید.
برای استفاده از این افزونه میتوانید روی دکمه زیر کلیک کرده و آن را از مخزن وردپرس دریافت کنید. پس از نصب افزونه منوی Query Monitor در نوار ابزار پیشخوان وردپرس اضافه میشه که با کلیک روی اون میتونید جزییات هر درخواست از صفحه وردپرس را ببینید.
پیشنهاد ما: افزونه های وردپرس
۲. بررسی کوئری وردپرس با Debug Bar
یکی دیگه از افزونههایی که با استفاده از اون میتونید کوئری ها و درخواستهای کند در وردپرس رو مشاهده کنید با نام Debug Bar در مخزن وردپرس به ثبت رسیده که مشابه افزونه قبلی اطلاعات مفیدی از درخواستهای فعلی که در هر صفحه اجرا میشوند را به شما خواهد داد. این افزونه امکانات زیر را برای مشاهده درخواست های دیتابیس میدهد.
- مشاهده پارامترهای WP_Query
- درخواست اطلاعات کوئریها
- مشاهده درخواستهای انجام گرفته در SQL صفحه فعلی
این افزونه به گونهای طراحی شده است که با استفاده از چند افزونه جانبی میتوانید امکانات آن را افزایش داده و بررسی دقیقتری روی دیتابیس وردپرس و حل مشکل کند بودن در وردپرس داشته باشید. در رابطه با این افزونه قبلا در مقاله آموزش رفع مشکل کندی لود در وردپرس با افزونه مفصلا توضیحات لازم را ارائه دادم که میتونید ازش استفاده کنید.
رفع کوئریهای کند در وردپرس
تا اینجای کار به معرفی دو افزونه کاربردی برای یافتن کوئریهای کند در وردپرس پرداختم. پس تا اینجا ما طبق توضیحاتی که در ابتدای مقاله دادم اولین مرحله برای حل مشکلات کندی وردپرس را که شناسایی کوئریهای کند بود پشت سر گذاشتیم. حالا که لیستی از کوئریهای کند وردپرس به دست آوردید در این مرحله باید بدونید منبع اجرای این کوئری های از کجاست تا با بررسی کدها مشکل رو برطرف کنید.
این منبع میتونه در هسته وردپرس، افزونه وردپرس یا قالب وردپرس قرار داشته باشه که از کدهای برنامه نویسی برای اجرای درخواست خاصی استفاده کردید. اما حالا به هر دلیلی مثل بهینه نبودن کدها یا ایجاد اختلال با قالب سایت یا افزونه خاصی باعث شده که مدت زمان اجرای کوئری طول بکشه و در نهایت نتیجهاش چیزی جز کند شدن سرعت وردپرس نیست.
برای یافتن این کدها کلید واژه EXPLAIN در MYSQL میتونه مفصلا توضیح بده که دقیقا چه اتفاقی در سایت رخ داده که باعث کندی در سرعت وردپرس شده. اضافه کردن EXPLAIN به شروع یک کوئری در دیتابیس وردپرس نشون میده که MySQL یک کوئری را اجرا کرده. EXPLAIN برای نمادهای پیچیده، میتونه به شناسایی نقاط آهسته در SQL ها کمک بکنه. به عنوان مثال نمونه زیر را در نظر بگیرید.
SELECT slow_column FROM slow_table
برای کوئری بالا میتونید با استفاده از EXPLAIN کردن این کوئری را به شکل زیر اجرا کنید.
EXPLAIN SELECT slow_column FROM slow_table
در این صورت خروجی EXPLAIN در phpMyAdmin به شکل زیر ظاهر خواهد شد.
با این حال همه کارهای داخلی که در دیتابیس اجرا میشوند قابل درک نیستند. اما اجرای EXPLAIN در کوئریها به خوبی میتونه درک کنه که چه چیزی در SQL پایگاه داده در حال اجرا شدن هست. آیا این کوئری در حال اجرای یک شاخص هست؟ آیا این کوئری کل جدول را در دیتابیس اسکن میکند؟ از ویژگیهای خوب EXPLAIN اینه که اطلاعاتی را برای کمک به درک چیزی که در حال وقوع است فراهم میکند. میتونید EXPLAIN را با استفاده از خط فرمان MySQL خود اجرا کنید.
پیشنهاد ما: امنیت در وردپرس
انتخاب اول: تغییر کوئری
به عنوان مثال فرض کنید درخواست زیر رو در Edit Post داریم که سرعت اجرای کوئری را در دیتابیس در حد یک حلزون کند کرده است. این کوئری بخشی از فیلد متا جعبه سفارشی در دیتابیس است.
SELECT meta_key FROM wp_postmeta GROUP BY meta_key HAVING meta_key NOT LIKE '\\_%' ORDER BY meta_key LIMIT 100
این بیت خاص SQL یک لیست از meta_keys هست که در جدول wp_postmeta قرار دارد و با underscore (_) شروع نمیشود. GROUP BY هم به این معنیه که هر نتیجه از این کوئری منحصر به فرد است. بعد از اجرای این کوئری برای ۵ بار نتیجه زیر حاصل شد.
- ۱.۷۱۴۶ ثانیه
- ۱.۷۹۱۲ ثانیه
- ۱.۸۰۷۷ ثانیه
- ۱.۷۷۰۸ ثانیه
- ۱.۸۴۵۶ ثانیه
حالا به نظر شما میتونیم کاری کنیم که با اجرای یک کوئری این مدت زمانها کمتر شوند؟ برای این کار با باید از یک meta_keys منحصر به فرد استفاده کنیم. منظور از منحصر به فرد بودن در اینجا متمایز بودن کوئری هست. به عنوان نمونه از DISTINCT برای این کار استفاده میکنیم.
SELECT DISTINCT meta_key FROM wp_postmeta WHERE meta_key NOT LIKE '\\_%' ORDER BY meta_key
حالا بعد از اجرای کوئری مورد نظر به این روش نتایج به شکل زیر تغییر پیدا میکنند.
- ۰.۳۷۶۴ ثانیه
- ۰.۲۶۰۷ ثانیه
- ۰.۲۶۶۱ ثانیه
- ۰.۲۷۵۱ ثانیه
- ۰.۲۹۸۶ ثانیه
این یک مقایسه علمی است. اما نتایج بسیار خوبی را در پی داشته و رسیدن به این زمان واقعا راضی کننده است.
انتخاب دوم: افزودن شاخص یا Index
هنگامی که یک query SQL را در یک جدول MySQL استاندارد اجرا میکنید، MySQL باید تمام جدول را اسکن و بررسی بکنه تا مشخص بشه کدوم ردیف مربوط به این کوئری خاص هست. وقتی دیتابیس شما بزرگ باشد، انجام این اسکن و بررسی مدت زمان زیادی طول خواهد کشید. اما این در حالی است که شاخصهای MySQL وارد میشوند. شاخصها دادهها را از جدولی می گیرند و آن را سازماندهی میکنند تا اطلاعات را بسیار آسانتر کند. با سازماندهی دادهها به این روش خاص، شاخصها کمک میکند تا مقدار اسکن شده MySQL را برای هر کوئری به کمترین مقدار ممکن برسانید. شاخصها را میتوان مانند نمونه زیر به ستونهای تک یا چند ستون اضافه کرد.
CREATE INDEX wp_postmeta_csstricks ON wp_postmeta (meta_key)
با استفاده از شاخص meta_key، زمان واقعی پرس و جو SQL به شرح زیر خواهد بود.
- ۰.۰۰۴۲ ثانیه
- ۰.۰۰۲۴ ثانیه
- ۰.۰۰۳۱ ثانیه
- ۰.۰۰۲۶ ثانیه
- ۰.۰۰۲۰ ثانیه
انتخاب سوم: کش نتایج کوئری
ما میدانیم که یک کوئری کند داریم. حالا اگر به جای تغییر کوئری، اگر فقط نتایج را ذخیره کنیم چه اتفاقی رخ خواهد داد؟ به این ترتیب محدودیتی روی اجرای این کوئری اعمال خواهیم کرد که با استفاده از آن میتوانیم یک «گذرگاه آزاد» را دریافت کنیم. برای ذخیره کردن یکی کوئری میتوانیم از Transients API وردپرس استفاده کنیم که برای ذخیره نتایج هزینه بر مانند موارد زیر قابل استفاده است.
- درخواستهای وب سایتهای خارجی(به عنوان مثال، پستهای اخیر فیس بوک)
- تکههای آهسته پردازش(به عنوان مثال جستجوی رشتههای طولانی)
- درخواستهای کند پایگاه داده
ذخیره یک نتیجه کوئری چیزی شبیه به نمونه زیر خواهد بود.
if ( false === ( $results = get_transient( 'transient_key_name' ) ) ) { $results = ...; // Do the slow query to get the results here // ۶۰ * ۶۰ is the expiration in seconds - in this case, 3600 seconds (1 hour) set_transient( 'transient_key_name', $results, 60 * 60 ); }
ذخیره کردن نتیجه یک کوئری مثل این بدان معنی است که این کوئری در هر یک ساعت انجام خواهد گرفت یا خیر. اگر شما یک کوئری با نتایجی که اغلب تغییر نمیکند دارید، استفاده از گذرگاهها یک روش عالی برای جلوگیری از ضربه زدن به پایگاه داده هستند.
انتخاب یک رویکرد نهایی
در این آموزش ما به معرفی سه راهکار و انتخاب پرداختیم. البته لازم به ذکر است که تقریبا تا ۱۷ رویکرد مختلف دیگر نیز وجود دارد که با استفاده از انها میتوانید کوئریهای کند در وردپرس را برطرف کنید. اما به نظر شما از بین سه راهکار بالا، کدامیک نیاز ما را برطرف خواهند کرد؟
رویکرد اول: نتیجه این رویکرد بسیار عالی بود. اما اگر بازنویسی مجدد این کوئری همین نتایج را به دنبال نداشته باشد، چه اتفاقی رخ خواهد داد؟ ما میتوانیم به صورت ناخودآگاه با قرار دادن یک کد در کوئری اجرای ان را کندتر کنیم.
رویکرد دوم: بسته به جدول و ستونهایی از دیتابیس که این کوئری در آنها اجرا میشود، همیشه نمیتواند نتیجه خوبی داشته باشد. در مورد جداول هسته وردپرس، باید نگرانیهای زیر را داشته باشید.
- آیا با بروزرسانی معمول هسته وردپرس، انتظار میرود که شاخصهای اضافی در آن ایجاد شود؟
- آیا اضافه کردن یا آپدیت یک شاخص، باعث کند شدن سایر کوئریها خواهد شد؟
رویکرد سوم: این رویکرد دارای حداقل تاثیر است. چرا که ما کوئری اصلی را تغییر نداده و نیازی هم به تغییر پایگاه داده نداریم.
در بیشتر موارد از گزینه سوم استفاده میشود.بسته به کوئری و اطلاعاتی که در دیتابیس شما قرار دارد ممکن است استفاده از سایر گزینهها بهتر باشد. اجرای کند کوئریها در وردپرس نتایج یکسانی ندارند. بنابراین میتوانید بر اساس شرایط سایت خود با این رویکرد مخالف بوده و یا موافق آن باشید. و یا حتی میتوانید از همه اینها نیز استفاده کنید.