تقليل إستهلاك الذاكرة في Laravel Eloquent بإستخدام Select Only

تقليل إستهلاك الذاكرة في Laravel Eloquent بإستخدام Select Only

2024-05-15 وقت القراءه : 2 دقائق

واحدة من أهم الإمور التي يجب أن يأخذها المطور بعين الإعتبار أثناء بناء تطبيقاته هي تقليل إستهلاك الذاكرة، في هذا المقال سوف نتحدث عن تقليل إستهلاك الذاكرة، عن طريق جلب البيانات التي نريدها من قاعدة البيانات.

إن تقليل إستهلاك الذاكرة لا يؤثر فقط على قدرة السيرفر على حمل الموقع، بل يؤثر أيضا على سرعة الموقع، حيث يجعل من الكود أسرع في عرض البيانات للزوار.


تخيل أن لدينا قاعدة بيانات تحتوي على مجموعة من الكتب ونريد إظهارها حسب سنة إنتاج كل كتاب كما بالصورة التالية

  

جملة الإستعلام للحصول على الكتب حسب تاريخ الإنتاج لكل كتاب

public function index(){
    $years = Book::query()
        ->with('author')
        ->latest('published_at')
        ->get()
        ->groupBy(function ($book){
            return Carbon::parse($book->published_at)->format('Y');
        });
    return view('books',compact('years'));
}

 

وفي ملف blade للعرض 

<div class="row">
@foreach($years as $year => $books)
    <div class="col-4">
        <div class="card mt-2">
            <div class="card-header">{{ $year }}</div>
            <ul class="list-group list-group-flush">
                @foreach($books as $book)
                    <li class="list-group-item">{{ \Illuminate\Support\Str::limit($book->title, 40) }}</li>
                @endforeach
            </ul>
        </div>
    </div>
@endforeach
</div>


لو ألقينا نظرة على debug bar نجد أنه

  • تم إستخراج جميع الحقول في جدول books وإستخراج جميع المعلومات من جدول authors، مع العلم إننا نحتاج فقط إسم الكتاب.
  • نلاحظ أيضا أنه تم إستهلاك 21MB من الذاكرة.

 

الحل هنا لتخفيف إستهلاك الذاكرة من خلال جلب الحقول التي نريدها فقط من قاعدة البيانات

public function index(){
    $years = Book::query()
         ->select('id','title','published_at','author_id')
        ->with('author:id,title')
        ->latest('published_at')
        ->get()
        ->groupBy(function ($book){
            return Carbon::parse($book->published_at)->format('Y');
        });
    return view('books',compact('years'));
} 

لو ألقينا نظرة على debug Bar نجد أنه 

 

  • تم إستخراج فقط الحقول التي نحتاجها من قاعدة البيانات.
  • تم تقليل إستهلاك الذاكرة من 31MB إلى 4MB.

التعليقات
زائر
منذ 3 سنوات

مشكووووووووووووووووور يا طيب

عبدالله القثامي
منذ 3 سنوات

عندي سؤال بخصوص ال grouping؟ ليه سويت ال group by على مستوى ال php وما سويته على مستوى قاعدة البيانات؟

إضافة تعليق
Loading...