Kutafuta N+1s na Kuondoa Query Zinazopoteza Muda katika Laravel

Kazi za utendaji (performance) mara nyingi huwa za kuchosha.

Sio kila wakati ni kuhusu hadithi za kishujaa ambapo unapunguza ucheleweshaji (latency) kwa 80%. Siku nyingi, ni kuhusu usafi. Unapata query ambazo hukuwa unajua unazitumia. Kisha, unazifuta.

Ikiwa programu yako ya Laravel inakua, huenda una matatizo haya matatu.

1. Query za N+1 Zilizojificha

Huwezi kurekebisha kitu ambacho huwezi kukiona. Tumia zana kama beyondcode/laravel-query-detector katika mazingira yako ya ndani (local environment). Inakuambia unapotumia mfumo wa loop-and-lazy-load.

Usikiendeshe hii kwenye uzalishaji (production). Inaongeza mzigo wa kazi (overhead). Iandikishe (register) tu wakati programu yako ipo katika hali ya ndani (local) au ya majaribio (testing).

2. Upotevu wa Eager Loading

Watu mara nyingi hutatua matatizo ya N+1 kwa kuongeza with(). Lakini hii inatengeneza tatizo jipya. Unaweza kufanya eager-load ya uhusiano (relationship) ambao view yako hauitumii tena.

Ikiwa mabadiliko ya muundo (redesign) yataondoa safu (column) kutoka kwenye jedwali, lazima uondoe wito wa with() unaohusiana katika controller yako. Unalipia data unayoitupa.

Chukulia kila eager load kama dai. Ikiwa hautumii data hiyo, ondoa dai hilo.

3. Kurudia Kukokotoa Data Ileile

Baadhi ya thamani hubaki vile vile kwa ombi (request) lote. Ukizikokotoa mara nyingi, unapoteza CPU. Tumia memoization ili kurekebisha hili.

Mfano:

protected ?string $defaultConnection = null;

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

Opereta ya ??= inakokotoa thamani mara moja na kuitumia tena kwa sehemu iliyobaki ya ombi.

4. Mitego ya Query kwenye Dashboard

Dashboards mara nyingi huendesha query ya count() tofauti kwa kila kadi. Ikiwa una kadi sita, unaendesha query sita.

Badala yake, fanya mambo haya mawili:

  • Panga jumla zako (group your counts). Pata jumla zote za jedwali moja katika query moja.
  • Tumia cache ya muda mfupi. Takwimu za dashboard hazihitaji kuwa za wakati halisi (live) hadi sekunde. Azihifadhi (cache) kwa dakika tano.

Mtembeleaji mmoja analipia gharama ya query. Wengine wote wanapata matokeo yaliyohifadhiwa (cached).

Kidokezo cha Mwisho: Zuia Kurudi Nyuma (Prevent Regressions)

Usafishaji hushindwa ikiwa watengenezaji (developers) wataongeza tena kodi mbaya baadaye. Tumia Pest kuhakikisha (assert) idadi ya query zako. Weka kikomo cha idadi ya query ambayo ukurasa unaweza kuendesha. Ikiwa mtengenezaji ataongeza N+1, jaribio (test) litafeli.

Uboreshaji (optimization) kwa kiasi kikubwa ni kuhusu kuondoa. Ondoa mizigo (loads) isiyotumika. Ondoa thamani zinazokokotolewa upya. Ondoa query zisizo za lazima.

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