Laravel માં N+1s ને શોધવા અને બિનજરૂરી ક્વેરીઝ (Queries) ને દૂર કરવા
પરફોર્મન્સ પરનું કામ ઘણીવાર કંટાળાજનક હોય છે.
તે હંમેશા એવા 'હીરો' વાળા કિસ્સાઓ નથી હોતા જ્યાં તમે લેટન્સી (latency) ને 80% ઘટાડી દો. મોટાભાગના દિવસોમાં, તે માત્ર સફાઈ કરવા વિશે હોય છે. તમને એવી ક્વેરીઝ મળે છે જે તમે ચલાવી રહ્યા છો તેની તમને ખબર પણ નથી હોતી. પછી, તમે તેને ડિલીટ કરી દો છો.
જો તમારું Laravel એપ વધી રહ્યું હોય, તો શક્ય છે કે તમને આ ત્રણ સમસ્યાઓનો સામનો કરવો પડતો હોય.
1. છુપાયેલી N+1 ક્વેરીઝ (Queries)
તમે જે જોઈ શકતા નથી તેને સુધારી શકતા નથી. તમારા લોકલ એન્વાયરમેન્ટમાં beyondcode/laravel-query-detector જેવા ટૂલનો ઉપયોગ કરો. જ્યારે તમે loop-and-lazy-load પેટર્નનો ઉપયોગ કરો છો, ત્યારે તે તમને જણાવશે.
આને પ્રોડક્શનમાં ન ચલાવો. તે ઓવરહેડ (overhead) વધારે છે. જ્યારે તમારી એપ લોકલ અથવા ટેસ્ટિંગ મોડમાં હોય ત્યારે જ તેને રજિસ્ટર કરો.
2. Eager Loading નો બગાડ
લોકો ઘણીવાર with() ઉમેરીને N+1 સમસ્યાઓ સુધારે છે. પરંતુ આ એક નવી સમસ્યા ઊભી કરે છે. તમે કદાચ એવી રિલેશનશિપને eager-load કરી શકો છો જેનો ઉપયોગ હવે તમારા વ્યુ (view) માં થતો નથી.
જો રિડિઝાઇન દરમિયાન ટેબલમાંથી કોઈ કોલમ દૂર કરવામાં આવે, તો તમારે તમારા કંટ્રોલરમાં તેને અનુરૂપ with() કોલ પણ દૂર કરવો જોઈએ. તમે એવા ડેટા માટે કિંમત ચૂકવી રહ્યા છો જેને તમે ફેંકી રહ્યા છો.
દરેક eager load ને એક ક્લેમ (claim) તરીકે ગણો. જો તમે ડેટાનો ઉપયોગ ન કરતા હોવ, તો તે ક્લેમ દૂર કરો.
3. એક જ ડેટાને વારંવાર ગણવો (Recomputing)
અમુક વેલ્યુ આખા રિક્વેસ્ટ દરમિયાન સમાન રહે છે. જો તમે તેને વારંવાર ગણશો, તો તમે CPU વેસ્ટ કરશો. આને સુધારવા માટે memoization નો ઉપયોગ કરો.
ઉદાહરણ:
protected ?string $defaultConnection = null;
public function getDefaultConnectionName(): string
{
return $this->defaultConnection ??= $this->resolveDefaultConnection();
}
??= ઓપરેટર વેલ્યુને એક જ વાર ગણે છે અને બાકીના રિક્વેસ્ટ માટે તેનો ફરીથી ઉપયોગ કરે છે.
4. ડેશબોર્ડ ક્વેરી ટ્રેપ્સ (Dashboard Query Traps)
ડેશબોર્ડ્સ ઘણીવાર દરેક કાર્ડ માટે અલગ count() ક્વેરી ચલાવે છે. જો તમારી પાસે છ કાર્ડ હોય, તો તમે છ ક્વેરી ચલાવો છો.
તેના બદલે આ બે વસ્તુઓ કરો:
- તમારા કાઉન્ટ્સને ગ્રુપ કરો. એક જ ક્વેરીમાં એક ટેબલના તમામ ટોટલ મેળવો.
- શોર્ટ કેશ (short cache) નો ઉપયોગ કરો. ડેશબોર્ડ સ્ટેટ્સ સેકન્ડ-ટુ-સેકન્ડ લાઈવ હોવાની જરૂર નથી. તેને પાંચ મિનિટ માટે કેશ કરો.
એક વિઝિટર ક્વેરીનો ખર્ચ ભોગવે છે. બાકીના દરેકને કેશ કરેલ પરિણામ મળે છે.
અંતિમ ટિપ: રિગ્રેસન્સ (Regressions) અટકાવો
જો ડેવલપર્સ પછીથી ફરીથી ખરાબ કોડ ઉમેરી દે, તો ક્લીનઅપ નિષ્ફળ જાય છે. તમારી ક્વેરી કાઉન્ટ્સ ચેક કરવા માટે Pest નો ઉપયોગ કરો. એક પેજ કેટલી ક્વેરી ચલાવી શકે તેની મર્યાદા (ceiling) નક્કી કરો. જો કોઈ ડેવલપર N+1 ઉમેરે છે, તો ટેસ્ટ ફેલ થશે.
ઓપ્ટિમાઇઝેશન (Optimization) મોટે ભાગે વસ્તુઓ દૂર કરવા વિશે છે. બિનઉપયોગી loads દૂર કરો. ફરીથી ગણવામાં આવતી વેલ્યુઝ દૂર કરો. બિનજરૂરી ક્વેરીઝ દૂર કરો.
