Když je dotaz příliš široký, GraphQL zpomalí každý render

Aus Rettungsdienst-Wiki
Zur Navigation springen Zur Suche springen

Materiály držte v kontrastu, ne v souzvu

Nejčastější příčinou pomalých GraphQL dotazů není server ani databáze, ale sám klient. Vývojáři často posílají jeden velký dotaz, který tahá všechny možné vnořené objekty, i když jich v komponentě vykreslí jen zlomek. GraphQL sice umožňuje přesně specifikovat, co potřebujete, ale tuto výhodu je nutné aktivně využívat. Pokud posíláte dotaz, který vrací desítky polí a několik úrovní vnoření, každý render na klientovi zpracovává data, která vůbec nepoužije. Prvním krokem k optimalizaci je tedy projít si všechny dotazy v projektu a u každého zkontrolovat, zda vrací právě ta pole, která se skutečně spotřebují v UI.

Nezapomeňte si ověřit, jestli obchod existuje i mimo svou vlastní doménu. Zadejte jeho název do vyhledávače a všimněte si, jestli se objevuje v oficiálních rejstřících, na srovnávacích serverech nebo v diskusích o podvodech. Zkontrolujte také stáří domény – weby vytvořené před několika týdny, které už prodávají drahé zboží za podezřele nízké ceny, bývají past. Fotky zboží hledejte přes obrázkové vyhledávání; pokud se stejná fotka objevuje u desítek jiných obchodů, jde pravděpodobně o kopii.

Voda a vlhkost ničí všechno, co není přizpůsobené. Proto se vyhněte látkovým organizérům na mokré zdi, papírovým krabicím v blízkosti sprchy a dřevěným policím bez povrchové úpravy. Kovové držáky volte s povrchovou úpravou proti korozi, plastové jen tam, kde nejsou na očích. Po každém sprchování nechte koupelnu vyvětrat, jinak se i sebelepší uspořádání do pár měsíců promění v plíseň za sprchovým koutem.

Jedlá soda je zásada a na mastný povlak se hodí jako pasta. Nasyp ji na vlhkou houbu, přidej několik kapek vody a vytvoř hustou kaši. Tou přejdi sporák, vnitřek trouby nebo plech. Nech působit deset až patnáct minut a pak setři. U trouby se vyhni pečicímu kameni, který je potažený speciální vrstvou, protože soda ho může zdrsnit. U digestoře vyndej kovový filtr a namoč ho do horké vody s několika lžícemi sody. Po půl hodině ho opláchni a nech uschnout. Právě filtr bývá nejčastějším zdrojem zatuchlého pachu.

Vezměte kámen na denní světlo a poté pod UV lampu. Pod UV lampou uvidíte, zda a jak silně kámen svítí. Poté ho položte na bílý papír a pozorujte ho při denním světle z několika úhlů. Pokud je kámen zakalený nebo ztrácí lesk, může to být právě důsledek silné fluorescence. Totéž zkuste pod běžnou stolní lampou, protože některé zářivky obsahují UV složku. Všímejte si rozdílu mezi tím, co vidíte na vlastní oči, a tím, co tvrdí certifikát.

Hlídejte si hloubku vnoření a rekurzivní vztahy GraphQL neomezuje hloubku dotazu, dokud to sami nenastavíte. Dotaz, který se zanořuje pět nebo šest úrovní, může na serveru způsobit exponenciální nárůst práce, zvláště pokud každá úroveň znamená samostatný dotaz do databáze. To je klasický problém N+1. Řešením je na serveru použít batchování nebo dataloader, který seskupí požadavky na stejnou entitu do jednoho dotazu. Na klientovi pak zkontrolujte, zda skutečně potřebujete všechna vnoření. Často stačí vnořit o úroveň méně a zbytek dotáhnout lazy loadem až ve chvíli, kdy uživatel rozbalí detail.

Další častá chyba je ignorování cache. GraphQL klienti umí cachovat podle ID objektu, ale pouze tehdy, pokud dotaz vrací pole id a pokud se stejná data nenačítají znovu s jinými parametry. Pokud posíláte stejný dotaz s jiným polem pro řazení nebo filtr, cache se mine účinkem. Zkontrolujte, zda vaše komponenty nepřebíjejí cache zbytečnými obnoveními. Někdy stačí nastavit správnou politiku cache a počet požadavků klesne na polovinu.

Typická chyba je opakované načítání stejných dat v různých komponentách. Místo jednoho dotazu na úrovni stránky se volá několik menších dotazů, které se navíc překrývají. To zvyšuje počet síťových požadavků a zatěžuje server. Řešením je sloučit příbuzné dotazy do jednoho a použít fragmenty pro opakovaně používané části schématu. Fragmenty ale nepoužívejte jen kvůli eleganci kódu – musí odpovídat reálným potřebám komponenty. Fragment, který obsahuje pole, jež se v dané komponentě nikdy nevykreslí, je jen jiná forma zbytečného přenosu dat.

Na závěr: optimalizace GraphQL není o jednom triku, ale o disciplíně. Pravidelně kontrolujte, co jednotlivé dotazy vracejí, měřte počet požadavků a dobu odezvy, a hlavně se ptejte, zda každé pole v dotazu má své místo v UI. Jakmile začnete dotazy krátit a slučovat, uvidíte rozdíl nejen na serveru, ale i v plynulosti celé aplikace.

Pro rok 2026 je také důležité sledovat, jak se dotazy chovají při pomalém připojení. GraphQL umí vrátit jen to, co je potřeba, ale pokud je odpověď velká, klient čeká na všechna data, než začne vykreslovat. Řešením je rozdělit dotaz na části, které lze načítat postupně, nebo použít odložené fragmenty. To znamená, že se nejprve vrátí základní data a teprve potom zbytek. Tento přístup výrazně zlepší vnímaný výkon, i když celkový čas na pozadí zůstane stejný.