سرعت نسخه بعدی لاراول Scout بهبود ۶۴ برابری خواهد داشت + جزئیات

بدون دیدگاه

لاراول اسکوت (Laravel Scout) ابزاری جداگانه برای اضافه کردن قابلیت جستجوی متنی به سایت لاراولی است. اگر نیاز به جستجوی Full Text در سایت تان دارید می توانید این ماژول را نصب کرده و تنظیم کنید تا اطلاعات همه مدل های دیتابیس را ایندکس کند . بدین ترتیب نتایج را سریع تر یافته و نمایش می دهد.
نسخه بعدی Laravel Scout قادر خواهد بود مدل های شما را تا ۶۴ برابر سریع تر ایندکس کند. می توانید pull request مربوطه را اینجا ببینید.

در این پست توضیح می دهیم که چطور تغییر می تواند انقدر تاثیر زیادی داشته باشد. این تکنیک جدای از لاراول، به افزایش سرعت MySQL مربوط است و روی همه پروژه ها قابل استفاده است.من از این تکنیک در همه پروژه هایی که می نویسم استفاده می کنم و به احتمال زیاد شما هم بعد از آشنایی با آن می توانید موارد مشابهی در پروژه های تان پیدا کنید که به همین صورت قابلیت بهبود سرعت دارند.

پیش زمینه

به صورت پیش فرض scout هر سطری از دیتابیس شما را ایندکس می کند. برای اینکه استفاده از ram زیاد بالا نرود در هر نوبت فقط تعداد محدودی شامل چند هزار سطر را با استفاده از متد chunk می گیرد.

متد chunk یک limit و یک offset به انتهای کوئری اضافه می کند.مثل این:

select * from `users` order by `id` asc limit 500 offset 500;

برای دریافت صفحه بعدی نتایج، فقط مقدار offset بیشتر می شود.

select * from `users` order by `id` asc limit 500 offset 1000;

این کوئری اولش خیلی خوب کار می کند و اجرای کوئری فقط چند میلی ثانیه طول می کشد. ولی هر چه جلوتر بروید کندتر می شود.

در همین رابطه :   LaraCSV - ایجاد فایل های CSV از اطلاعات جداول Eloquent Model

وقتی به offset حدود ۱,۰۰۰,۰۰۰ برسد سرعت اجرای کوئری به راحتی تا ۵۰۰ برابر کندتر می شود. وقتی scout صدها بار این کوئری را اجرا کند مشکلات بیشتر هم می شوند.

چرا Offset کند است؟

وقتی شما از offset استفاده می کنید، به دیتابیس می گویید که X رکورد اول را رد کن. حتی اگر رکورد های رد شده برگشت داده نشوند، دیتابیس هنوز آنها را از دیسک می خواند و مرتب می کند.

راه حل سریع تر متد ChunkById است

به نظر می رسد راه حل بهتر عدم استفاده از offset است. تنها کاری که باید انجام دهیم این است که ID آخرین زکوردی که دیده ایم را نگه داریم و بعد فقط رکوردهای بعد از آن را که ندیده ایم بگیریم. اگر رکوردها به ترتیب صعودی قرار گرفته اند می توانیم به سادگی برای فیلتر از شرط WHERE ID > :last_id استفاده کنیم.

پس کوئری نهایی اینطوری خواهد بود:

select * from `users` where `id` > :last_id order by `id` asc limit 500;

با این تکنیک صفحه آخر هم مثل صفحه اول نتایج خیلی سریع لود خواهد شد.

لاراول کار ما رو ساده تر کرده است. به جای فراخوانی chunk باید chunkById رو فراخوانی کنیم که از لاراول ۵.۲ اضافه شده است. بدین ترتیب لاراول شرط، ترتیب نمایش و محدودیت را خودش به کوئری اضافه می کند. امیدوارم از این تکنیک عالی و ساده استفاده کنید و سرعت سایت هاتون رو بالا ببرید.

منبع

دسته بندی : Laravel

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

More in Laravel
مترجم گوگل با لاراول

Laravel گوگل Translate بسته‌ای است که یک دستور کنسول برای ترجمه کردن فایل‌های زبان شما با API ترجمه گوگل فراهم...

Close