Django-তে only() এবং defer() মেথড ব্যবহার করে নির্দিষ্ট কিছু ফিল্ড ডেটাবেস থেকে রিট্রিভ করতে পারি, যা ডেটাবেস অপ্টিমাইজেশনের জন্য খুবই কার্যকরী। এগুলো ডেটাবেস থেকে অপ্রয়োজনীয় ফিল্ড লোড এড়িয়ে মেমরি ব্যবহারে সাশ্রয় করে এবং ক্যোয়ারির স্পিড বাড়ায়। আসুন, গল্পের মাধ্যমে বুঝে দেখি।
ধরুন, আমরা একটি ব্লগ ওয়েবসাইট তৈরি করছি যেখানে BlogPost নামে একটি মডেল আছে। প্রতিটি পোস্টের বড় বড় ফিল্ড আছে যেমন, শিরোনাম, বিষয়বস্তু, লেখক এবং আরো অনেক কিছু।
only() এবং defer() মেথডের ব্যবহার: বাস্তব উদাহরণ এবং পারফরম্যান্স
প্রথমে BlogPost মডেলটি দেখি:
# blog/models.py
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=255) # পোস্টের শিরোনাম
content = models.TextField() # পোস্টের বিষয়বস্তু
author = models.CharField(max_length=100) # লেখকের নাম
created_at = models.DateTimeField(auto_now_add=True) # তৈরি সময়
is_featured = models.BooleanField(default=False) # বৈশিষ্ট্যযুক্ত কিনা
def __str__(self):
return self.title
কেস স্টাডি: only() এবং defer() না ব্যবহার করলে
ধরুন, আমাদের একটি পেজ আছে যেখানে শুধু পোস্টের শিরোনাম এবং লেখকের নাম দেখাতে চাই, কিন্তু যদি আমরা only() বা defer() ব্যবহার না করি, তাহলে ডেটাবেস থেকে প্রতিটি পোস্টের সমস্ত ফিল্ড রিট্রিভ করা হবে।
# blog/views.py
from django.shortcuts import render
from .models import BlogPost
def show_blog_titles(request):
posts = BlogPost.objects.all() # সমস্ত ফিল্ড লোড করবে
return render(request, 'blog_titles.html', {'posts': posts})
এখন, BlogPost.objects.all() এর মাধ্যমে title, content, author, created_at, এবং is_featured ফিল্ডগুলো রিট্রিভ করা হবে, যদিও আমরা শুধুমাত্র title এবং author ফিল্ডগুলো পেজে দেখাবো। এর ফলে ডেটাবেসের উপর অতিরিক্ত লোড পড়ে, বেশি ডেটা ট্রান্সফার হয় এবং মেমরি ব্যবহারের পরিমাণও বেড়ে যায়।
only() দিয়ে ডেটাবেস অপ্টিমাইজ করা
এখন only() মেথড ব্যবহার করে শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলো রিট্রিভ করি, যাতে title এবং author ফিল্ড ছাড়া আর কিছু ডেটাবেস থেকে লোড না হয়:
# blog/views.py
def show_blog_titles_optimized(request):
posts = BlogPost.objects.only('title', 'author') # শুধুমাত্র 'title' এবং 'author' ফিল্ড লোড করবে
return render(request, 'blog_titles.html', {'posts': posts})
এখানে only('title', 'author') ব্যবহার করে শুধুমাত্র title এবং author ফিল্ড ডেটাবেস থেকে লোড হচ্ছে। ফলে সার্ভারের উপর লোড কমে, কোয়েরি দ্রুত সম্পন্ন হয় এবং মেমরি ব্যবহারে সাশ্রয় হয়।
defer() দিয়ে অপ্রয়োজনীয় ফিল্ড লোড এড়ানো
ধরুন, আমরা title, author ফিল্ড ছাড়া বাকি সব ফিল্ড লোড না করার সিদ্ধান্ত নিলাম, তাহলে defer() মেথড ব্যবহার করা যাবে।
এখানে defer('content', 'created_at', 'is_featured') মেথড ব্যবহার করে আমরা content, created_at এবং is_featured ফিল্ড লোড থেকে বাদ দিয়েছি। ফলে শুধুমাত্র title এবং author ফিল্ড লোড হবে, বাকি ফিল্ডগুলো ডেটাবেস থেকে নেয়া হবে না।
পারফরম্যান্স পার্থক্য: only() বা defer() না ব্যবহার করা বনাম ব্যবহার করা
- যখন
only()বাdefer()ব্যবহার করা হয় না: প্রতিটি ক্যোয়ারির জন্য সমস্ত ফিল্ড ডেটাবেস থেকে লোড হয়, যা মেমরি বেশি খরচ করে এবং ক্যোয়ারি সম্পন্ন হতে বেশি সময় নেয়। বড় টেবিল বা অনেক ফিল্ড থাকলে এই পারফরম্যান্স ইস্যু আরও প্রকট হয়। - যখন
only()ব্যবহার করা হয়: শুধু প্রয়োজনীয় ফিল্ডগুলো লোড হয়, যা দ্রুততর ক্যোয়ারি করে এবং কম মেমরি খরচ হয়। উদাহরণস্বরূপ, শুধুমাত্রtitleএবংauthorরিট্রিভ করতে হলে এটি দ্রুত এবং কম্প্যাক্ট ডেটা ট্রান্সফার নিশ্চিত করে। - যখন
defer()ব্যবহার করা হয়: অপ্রয়োজনীয় ফিল্ডগুলো বাদ দেয়া হয়, যা ক্যোয়ারিকে হালকা করে এবং লোড টাইম কমায়। পরে কোনো ফিল্ড দরকার হলে এটি ডেটাবেসে পুনরায় রিকোয়েস্ট করতে পারে।
only() এবং defer() এর ব্যবহার: কখন এবং কোথায়?
- প্রথম পেজ লোডের সময়: যখন শুধুমাত্র নির্দিষ্ট তথ্য প্রয়োজন,
only()এবংdefer()ব্যবহার করা যাবে যাতে পেজ দ্রুত লোড হয়। - ড্যাশবোর্ড বা তালিকা ভিউ: যেখানে অনেক পোস্ট বা ডেটা দেখানো হয় এবং শুধু নাম বা শিরোনাম প্রয়োজন হয়।
- API Endpoints: যখন API থেকে সীমিত ডেটা রিসপন্সে পাঠানো হয়, তখন নির্দিষ্ট ফিল্ডগুলো লোড করে ডেটা আকার ছোট রাখা যায়।