دسترسی سریع به عناوین این مقاله
در این بخش خواهیم دید که چگونه حذف select های بی استفاده از برنامه های ما می تواند سرعت برنامه لاراول را کاهش دهد.
بررسی مشکل افزایش سرعت لاراول:
Query مورد نیاز برای نمایش داده های صفحه اول بسیار راحت است.
<?php
namespace App\Http\Controllers;
use App\Post;
class PostsController extends Controller
{
public function index()
{
$years = Post::query()
->with('author')
->latest('published_at')
->get()
->groupBy(fn ($post) => $post->published_at->year);
return view('posts', ['years' => $years]);
}
}
پست ها را به ترتیب تاریخ انتشار از دیتابیس می خوانیم و رابطه ی authors را همراه آن ها eager load می کنیم و با کمک متد groupBy
کلاس Collection
، آن ها را گروه بندی می کنیم. سپس نتیجه به دست آمده را به فایل blade
با نام posts
می دهیم تا آن ها را نمایش دهد.
همان طور که مشاهده می کنید توسط یک Query همه پست ها و توسط Query دیگر همه ی نویسنده ها را از دیتابیس خوانده ایم.
اگر به قسمت Query ها بر گردیم می بینید که همه ی ستون های جدول posts از دیتابیس select شده اند. با اینکه ما در این صفحه تنها به عنوان، تاریخ و نویسنده ی پست ها نیاز داریم اما همه ستون ها را از دیتابیس فراخوانی کردیم که شامل متن پست ها هم می شود. بنابراین سرعت برنامه ما به دلیل فراخوانی متن پست ها که طولانی هم هستند، افزایش پیدا کرده است.
Query خود را به طوری تغییر می دهیم که تنها ستون های مورد نیاز ما از دیتابیس خوانده شوند.
<?php
namespace App\Http\Controllers;
use App\Post;
class PostsController extends Controller
{
public function index()
{
$years = Post::query()
->select(['id', 'title', 'slug', 'published_at', 'author_id'])
->with('author')
->latest('published_at')
->get()
->groupBy(fn($post) => $post->published_at->year);
return view('posts', ['years' => $years]);
}
}
توجه داشته باشید که همیشه primary key
جدول خود را select کنید. همچنین اگر می خواهید رابطه ای را eagerload کنید باید foreign key
آن رابطه را نیز در select خود قرار دهید (در مثال ما ستون های id
و author_id
به این دلیل select شده اند).
انجام این کار تنها به جدول اصلی مربوط نمی شود و هنگام eagerload کردن نیز می توان ستون های مورد نیاز را select کرد.
$years = Post::query()
->select(['id', 'title', 'slug', 'published_at', 'author_id'])
->with(['author' => function ($query) {
$query->select(['id', 'name']);
}])
->latest('published_at')
->get()
->groupBy(fn($post) => $post->published_at->year);
برای select کردن ستون های مورد نیاز هنگام eagerload یک میان بر هم وجود دارد.
$years = Post::query()
->select(['id', 'title', 'slug', 'published_at', 'author_id'])
->with('author:id,name')
->latest('published_at')
->get()
->groupBy(fn($post) => $post->published_at->year);
جمع بندی
در این مطلب دیدیم که چگونه انتخاب کردن ستون هایی از دیتابیس که مورد نیاز برنامه هستند، می تواند به کاهش مصرف مموری کمک کند. ممکن است به این فکر کنید که باید تمام Query هایی که در برنامه نوشتم را تغییر دهم و عبارت select را به آن ها اضافه کنم. به نظر من نیازی به انجام این کار نیست و تنها در صفحه هایی از برنامه که داده ی زیادی از دیتابیس فراخوانی می شود (مانند صفحه های index) انجام این کار ضروری است و برای باقی صفحه ها نیازی به تغییر کد قبلی نیست.
- تغییر اندازه عکس در PHP یا لاراول
- لیست شرکت های خلاق حوزه کسب و کارهای دیجیتال و فضای مجازی
- الگوریتم اعتبارسنجی کد شبا بانکی
- آشنایی با پیام های http
- مقدمه آموزش اصول برنامه نویسی