Laravel मध्ये N+1 शोधणे आणि वाया जाणारे Queries थांबवणे

परफॉर्मन्सवर काम करणे अनेकदा कंटाळवाणे असते.

हे नेहमीच ८०% लेटन्सी (latency) कमी करण्यासारख्या 'हिरो' कथांबद्दल नसते. बहुतेक वेळा, हे फक्त साफसफाई करण्याबद्दल असते. तुम्हाला असे queries सापडतात जे तुम्ही चालवत आहात हे तुम्हाला माहितही नसते. मग, तुम्ही ते काढून टाकता.

जर तुमचे Laravel ॲप वाढत असेल, तर तुम्हाला बहुधा या तीन समस्यांचा सामना करावा लागत असेल.

१. लपलेले N+1 Queries

जे दिसत नाही, ते तुम्ही सुधारू शकत नाही. तुमच्या लोकल एन्व्हायरमेंटमध्ये (local environment) beyondcode/laravel-query-detector सारखे टूल वापरा. तुम्ही 'loop-and-lazy-load' पॅटर्न वापरत असाल, तर ते तुम्हाला सांगते.

हे प्रोडक्शनमध्ये (production) चालवू नका. यामुळे ओव्हरहेड (overhead) वाढतो. तुमचे ॲप फक्त लोकल किंवा टेस्टिंग मोडमध्ये असतानाच ते रजिस्टर करा.

२. Eager Loading चा अपव्यय

लोक अनेकदा with() जोडून N+1 समस्या सोडवतात. पण यामुळे एक नवीन समस्या निर्माण होते. तुम्ही कदाचित असा एखादा रिलेशनशिप 'eager-load' करत असाल ज्याचा वापर तुमचा view आता करत नाही.

जर एखाद्या रिडिझाइनमुळे टेबलमधील एखादा कॉलम काढला गेला असेल, तर तुम्हाला तुमच्या कंट्रोलरमधील संबंधित with() कॉल देखील काढून टाकावा लागेल. तुम्ही अशा डेटासाठी खर्च करत आहात जो तुम्ही फेकून देत आहात.

प्रत्येक eager load ला एका दाव्यासारखे (claim) समजा. जर तुम्ही डेटा वापरत नसाल, तर तो दावा काढून टाका.

३. तोच डेटा पुन्हा मोजणे (Recomputing)

काही व्हॅल्यूज संपूर्ण रिक्वेस्टसाठी सारख्याच राहतात. जर तुम्ही त्यांची वारंवार गणना (calculate) केली, तर तुमचा CPU वाया जातो. हे सुधारण्यासाठी memoization वापरा.

उदाहरण:

protected ?string $defaultConnection = null;

public function getDefaultConnectionName(): string
{
    return $this->defaultConnection ??= $this->resolveDefaultConnection();
}

??= ऑपरेटर व्हॅल्यू एकदाच मोजतो आणि उर्वरित रिक्वेस्टसाठी तिचा पुनर्वापर करतो.

४. डॅशबोर्ड क्वेरी ट्रॅप्स (Dashboard Query Traps)

डॅशबोर्ड्समध्ये अनेकदा प्रत्येक कार्डसाठी वेगळी count() क्वेरी चालवली जाते. जर तुमच्याकडे सहा कार्ड्स असतील, तर तुम्ही सहा क्वेरीज चालवता.

त्याऐवजी या दोन गोष्टी करा:

  • तुमच्या counts ग्रुप करा. एका टेबलसाठीचे सर्व टोमॅल्स (totals) एकाच क्वेरीमध्ये मिळवा.
  • शॉर्ट कॅशे (short cache) वापरा. डॅशबोर्ड स्टॅट्स सेकंदाला सेकंद लाइव्ह असण्याची गरज नसते. त्यांना पाच मिनिटांसाठी कॅशे करा.

एका व्हिजिटरमुळे क्वेरीचा खर्च होतो. बाकी सर्वांना कॅश्ड रिझल्ट मिळतो.

शेवटचा सल्ला: Regressions रोखा

जर डेव्हलपर्सनी नंतर पुन्हा तोच खराब कोड जोडला, तर साफसफाईचा उपयोग होत नाही. तुमच्या क्वेरी काउंट्सची खात्री करण्यासाठी Pest वापरा. एका पेजवर किती क्वेरीज चालवता येतील याची एक मर्यादा (ceiling) सेट करा. जर एखाद्या डेव्हलपरने N+1 जोडला, तर टेस्ट फेल होईल.

ऑप्टिमायझेशन म्हणजे प्रामुख्याने काढून टाकणे होय. न वापरलेले loads काढून टाका. पुन्हा मोजलेले (recomputed) व्हॅल्यूज काढून टाका. अनावश्यक क्वेरीज काढून टाका.

Source: https://dev.to/nasrulhazim/a-day-of-performance-hardening-hunting-n1s-and-killing-wasted-queries-in-laravel-568p