Laravel میں N+1s کی تلاش اور فضول کوئریز (queries) کا خاتمہ
کارکردگی (Performance) پر کام کرنا اکثر بورنگ ہوتا ہے۔
یہ ہمیشہ ایسی ہیرو کہانیاں نہیں ہوتیں جہاں آپ لیٹنسی (latency) کو 80% تک کم کر دیں۔ زیادہ تر دن، یہ صرف صفائی ستھرائی کے بارے میں ہوتے ہیں۔ آپ کو ایسی کوئریز ملتی ہیں جن کے بارے میں آپ کو معلوم ہی نہیں تھا کہ وہ چل رہی ہیں۔ پھر، آپ انہیں حذف کر دیتے ہیں۔
اگر آپ کی Laravel ایپ بڑھ رہی ہے، تو ممکن ہے کہ آپ کو یہ تین مسائل درپیش ہوں۔
- Hidden N+1 Queries
آپ اسے ٹھیک نہیں کر سکتے جسے آپ دیکھ نہیں سکتے۔ اپنے لوکل ماحول (local environment) میں beyondcode/laravel-query-detector جیسا ٹول استعمال کریں۔ یہ آپ کو بتاتا ہے کہ کب آپ loop-and-lazy-load پیٹرن استعمال کر رہے ہیں۔
اسے پروڈکشن (production) میں نہ چلائیں۔ یہ اضافی بوجھ (overhead) ڈالتا ہے۔ اسے صرف اس وقت رجسٹر کریں جب آپ کی ایپ لوکل یا ٹیسٹنگ موڈ میں ہو۔
- Eager Loading Waste
لوگ اکثر with() شامل کر کے N+1 مسائل کو حل کرتے ہیں۔ لیکن یہ ایک نیا مسئلہ پیدا کرتا ہے۔ ہو سکتا ہے کہ آپ کسی ایسے ریلیشن شپ کو eager-load کر رہے ہوں جسے آپ کا ویو (view) اب استعمال نہیں کرتا۔
اگر ری ڈیزائننگ کے دوران کسی ٹیبل سے کالم ہٹا دیا جائے، تو آپ کو اپنے کنٹرولر میں متعلقہ with() کال کو بھی ہٹانا ہوگا۔ آپ اس ڈیٹا کی قیمت ادا کر رہے ہیں جسے آپ ضائع کر رہے ہیں۔
ہر eager load کو ایک دعوے (claim) کے طور پر سمجھیں۔ اگر آپ ڈیٹا استعمال نہیں کر رہے، تو اس دعوے کو ختم کر دیں۔
- Recomputing the Same Data
کچھ ویلیوز پورے ریکویسٹ (request) کے دوران ایک جیسی رہتی ہیں۔ اگر آپ انہیں بار بار کیلکولیٹ کرتے ہیں، تو آپ CPU ضائع کرتے ہیں۔ اسے ٹھیک کرنے کے لیے memoization کا استعمال کریں۔
Example:
protected ?string $defaultConnection = null;
public function getDefaultConnectionName(): string
{
return $this->defaultConnection ??= $this->resolveDefaultConnection();
}
??= آپریٹر ویلیو کو ایک بار کیلکولیٹ کرتا ہے اور باقی ریکویسٹ کے لیے اسے دوبارہ استعمال کرتا ہے۔
- Dashboard Query Traps
ڈیش بورڈز اکثر ہر کارڈ کے لیے ایک الگ count() کوئری چلاتے ہیں۔ اگر آپ کے پاس چھ کارڈز ہیں، تو آپ چھ کوئریز چلاتے ہیں۔
اس کے بجائے یہ دو کام کریں:
- اپنے کاؤنٹس کو گروپ کریں۔ ایک ہی ٹیبل کے تمام ٹوٹلز ایک ہی کوئری میں حاصل کریں۔
- مختصر کیش (cache) استعمال کریں۔ ڈیش بورڈ کے اعداد و شمار کا ہر سیکنڈ کے حساب سے لائیو ہونا ضروری نہیں ہے۔ انہیں پانچ منٹ کے لیے کیش کر لیں۔
ایک وزیٹر کو کوئری کی قیمت ادا کرنی پڑتی ہے۔ باقی سب کو کیش شدہ (cached) نتیجہ مل جاتا ہے۔
Final Tip: Prevent Regressions
اگر ڈویلپرز بعد میں دوبارہ برا کوڈ شامل کر دیں تو صفائی کا عمل ناکام ہو جاتا ہے۔ اپنی کوئریز کی تعداد کو یقینی بنانے کے لیے Pest کا استعمال کریں۔ ایک حد (ceiling) مقرر کریں کہ ایک پیج کتنی کوئریز چلا سکتا ہے۔ اگر کوئی ڈویلپر N+1 شامل کرتا ہے، تو ٹیسٹ فیل ہو جائے گا۔
آپٹیمائزیشن (Optimization) کا زیادہ تر مطلب چیزوں کو ہٹانا ہے۔ غیر استعمال شدہ لوڈز کو ہٹائیں۔ بار بار کیلکولیٹ ہونے والی ویلیوز کو ہٹائیں۔ غیر ضروری کوئریز کو ہٹائیں۔
