Laravel-இல் N+1-களைக் கண்டறிந்து தேவையற்ற வினவல்களை (Queries) ஒழித்தல்
செயல்திறன் மேம்பாட்டுப் பணிகள் (Performance work) பெரும்பாலும் சலிப்பூட்டுபவை.
தாமதத்தை (latency) 80% குறைப்பது போன்ற வீரக் கதைகள் எப்போதும் நிகழ்வதில்லை. பெரும்பாலான நேரங்களில், இது ஒரு சுத்தப்படுத்தும் பணியாகும். நீங்கள் இயங்கிக் கொண்டிருப்பதை அறியாத வினவல்களைக் கண்டறிந்து, பின்னர் அவற்றை நீக்குவதே இதன் வேலை.
உங்கள் Laravel செயலி வளர்ந்து கொண்டே இருந்தால், நீங்கள் பெரும்பாலும் இந்த மூன்று சிக்கல்களைச் சந்திப்பீர்கள்.
1. மறைந்திருக்கும் N+1 வினவல்கள் (Queries)
நீங்கள் பார்க்க முடியாத ஒன்றை உங்களால் சரிசெய்ய முடியாது. உங்கள் உள்ளூர் சூழலில் (local environment) beyondcode/laravel-query-detector போன்ற ஒரு கருவியைப் பயன்படுத்தவும். நீங்கள் 'loop-and-lazy-load' முறையைப் பயன்படுத்தும்போது அது உங்களுக்குத் தெரிவிக்கும்.
இதை production சூழலில் இயக்க வேண்டாம். இது கூடுதல் சுமையை (overhead) ஏற்படுத்தும். உங்கள் செயலி local அல்லது testing முறையில் இருக்கும்போது மட்டும் இதைப் பதிவு செய்யவும்.
2. Eager Loading வீணாதல்
மக்கள் பெரும்பாலும் with()-ஐச் சேர்ப்பதன் மூலம் N+1 சிக்கல்களைச் சரிசெய்ய முயல்கிறார்கள். ஆனால் இது ஒரு புதிய சிக்கலை உருவாக்குகிறது. உங்கள் view இனிப் பயன்படுத்தாத ஒரு உறவை (relationship) நீங்கள் eager-load செய்யக்கூடும்.
ஒரு மறுவடிவமைப்பு (redesign) அட்டவணையில் இருந்து ஒரு நெடுவரிசையை (column) நீக்கினால், உங்கள் controller-இல் அதற்கு இணையான with() அழைப்பையும் நீக்க வேண்டும். நீங்கள் எறிந்துவிடும் தரவிற்காகத் தேவையற்ற செலவைச் செய்கிறீர்கள்.
ஒவ்வொரு eager load-ஐயும் ஒரு கோரிக்கையாக (claim) கருதுங்கள். அந்தத் தரவைப் பயன்படுத்தவில்லை என்றால், அந்தத் தேவையை நீக்கிவிடுங்கள்.
3. ஒரே தரவை மீண்டும் கணக்கிடுதல்
சில மதிப்புகள் முழு கோரிக்கையின் போதும் (request) மாறாமல் இருக்கும். அவற்றை நீங்கள் பலமுறை கணக்கிட்டால், CPU வீணாகும். இதைச் சரிசெய்ய memoization முறையைப் பயன்படுத்தவும்.
உதாரணம்:
protected ?string $defaultConnection = null;
public function getDefaultConnectionName(): string
{
return $this->defaultConnection ??= $this->resolveDefaultConnection();
}
??= ஆபரேட்டர் மதிப்பை ஒருமுறை மட்டும் கணக்கிட்டு, மீதமுள்ள கோரிக்கைக்கு அதை மீண்டும் பயன்படுத்துகிறது.
4. Dashboard வினவல் பொறிகள் (Query Traps)
Dashboard-கள் பெரும்பாலும் ஒவ்வொரு கார்டுக்கும் (card) தனித்தனி count() வினவலை இயக்கும். உங்களிடம் ஆறு கார்டுகள் இருந்தால், நீங்கள் ஆறு வினவல்களை இயக்குகிறீர்கள்.
அதற்குப் பதிலாக இந்த இரண்டு விஷயங்களைச் செய்யுங்கள்:
- உங்கள் எண்ணிக்கைகளைத் தொகுக்கவும் (Group). ஒரு அட்டவணையின் அனைத்து மொத்தத் தொகைகளையும் ஒரே வினவலில் பெறவும்.
- குறுகிய கால கேச் (cache) முறையைப் பயன்படுத்தவும். Dashboard புள்ளிவிவரங்கள் ஒவ்வொரு நொடியும் துல்லியமாக இருக்க வேண்டிய அவசியமில்லை. அவற்றை ஐந்து நிமிடங்களுக்கு கேச் செய்யவும்.
ஒரு பார்வையாளர் வினவலின் சுமையைச் சுமப்பார். மற்ற அனைவரும் கேச் செய்யப்பட்ட முடிவைப் பெறுவார்கள்.
இறுதித் தகவல்: பின்னடைவைத் தடுத்தல் (Prevent Regressions)
டெவலப்பர்கள் பின்னர் மீண்டும் தவறான குறியீட்டைச் சேர்த்தால், சுத்தப்படுத்தும் பணிகள் தோல்வியடையும். உங்கள் வினவல் எண்ணிக்கையை உறுதிப்படுத்த (assert) Pest-ஐப் பயன்படுத்தவும். ஒரு பக்கம் எத்தனை வினவல்களை இயக்கலாம் என்பதற்கு ஒரு உச்சவரம்பை (ceiling) நிர்ணயிக்கவும். ஒரு டெவலப்பர் N+1-ஐச் சேர்த்தால், சோதனை (test) தோல்வியடையும்.
உகப்பாக்கம் (Optimization) என்பது பெரும்பாலும் நீக்குவதைப் பற்றியது. பயன்படுத்தாத லோடுகளை (loads) நீக்கவும். மீண்டும் கணக்கிடப்படும் மதிப்புகளை நீக்கவும். தேவையற்ற வினவல்களை நீக்கவும்.
