Do celkového srovnání započítej i věrnostní programy a možnost vrácení zboží. Někdy je výhodnější zaplatit o něco víc v obchodě, kde máš jistotu rychlé reklamace a bezplatného vrácení do určité lhůty. Ušetřené stovky korun totiž snadno zmizí, když musíš řešit vrácení na vlastní náklady nebo čekat týdny na vyřízení. Srovnávej tedy nejen cenu, ale i podmínky, které k ní patří.
Základem je připravit trasu ještě předtím, než se čehokoli dotknete. Změřte nejužší místo na cestě – šířku dveří, průchod mezi zdí a nábytkem, zúžení na chodbě. Těžký nábytek se většinou nepřenáší nad hlavou, ale protáčí, takže potřebujete i prostor na manévr. Odstraňte prahy, koberečky a volně položené předložky, které kloužou. Odkrytá podlaha se čistí snáz a zároveň vidíte každou nerovnost, o kterou by se noha mohla zachytit.
Utáhněte všechny spoje, ale nepřetáhněte
Používejte persistované dotazy a omezte hloubku i šířku dotazu. GraphQL sám o sobě nebrání klientovi poslat dotaz, který rekurzivně prochází celý graf. Nastavte maximální hloubku (například 7 úrovní) a maximální počet polí. Zároveň zvažte, zda klient potřebuje volat dynamické dotazy, nebo si vystačí s předem registrovanými. Persistované dotazy snižují velikost přenášených dat a umožňují serveru cachovat výsledky agresivněji.
Zajímavé je, že stejný princip filtrace používají i jiná zvířata – například plameňáci nebo někteří žraloci. Vždy jde o totéž: zachytit drobné částice a přebytečnou vodu odstranit. Plejtvák to dotáhl k dokonalosti. Jeho tělo je vlastně obrovská filtrační jednotka. Když si to uvědomíte, pochopíte, proč zuby nejsou potřeba. Nejsou to slabé místo. Jsou to jen nástroje, které evoluce vyřadila z provozu, protože je nahradilo něco lepšího – síto, které nikdy nezklame.
Nejčastější chyba je nacpat prostor tak, že krabice vyčnívají a překážejí při sezení nebo při úklidu. Další chybou je dávat tam věci „na věčné časy” a zapomenout, co tam vlastně je. Jednou za půl roku obsah projděte, vyhoďte, co už nepotřebujete, a zkontrolujte, jestli se neobjevila vlhkost nebo plíseň. U látek pravidelně vysávejte a větrejte, jinak se z úložného prostoru stane zdroj zápachu. A pozor na hmotnost — těžké bedny mohou poškodit podlahu i samotnou pohovku, pokud na ně tlačí.
Nakonec testujte výkon opakovaně a v izolaci. Měření na vývojovém stroji s malou databází neodhalí problémy, které se objeví až v produkci. Zátěžové testy by měly simulovat reálné dotazy, včetně těch, které klienti posílají nejčastěji. Sledujte p95 a p99 latence, ne jen průměr. Průměr totiž snadno skryje několik extrémně pomalých dotazů, které uživatele odradí.
Častou chybou je také příliš obecný resolver, který vrací celý objekt i s poli, která klient nepožaduje. GraphQL umožňuje vybrat pouze potřebná pole, ale resolver musí respektovat, co klient skutečně chce. Pokud resolver vždy načte všechny sloupce z databáze, výkon tím netrpí jen na úrovni sítě, ale i na úrovni I/O. Podívejte se na informace o dotazu (například AST) a načítejte jen to, co je potřeba.
Jak řešit N+1 a datové zdroje Pro dávkování používejte nástroje jako DataLoader nebo jeho ekvivalenty v jiných jazycích. DataLoader sbírá požadavky v rámci jednoho ticku event loopu a posílá je do databáze jako jeden dotaz s klauzulí IN. Pozor na dvě věci: nezapomeňte vytvářet instanci DataLoaderu pro každý request, jinak si klienti navzájem pomažou cache. A druhá: DataLoader nefunguje spolehlivě, pokud mezi jednotlivými resolvery předáváte data přes globální stav. Držte se kontextu requestu.
Prvním krokem k optimalizaci GraphQL dotazů není přepis resolverů, ale měření. Zapněte si logování doby zpracování jednotlivých polí a sledujte, které části dotazu trvají nejdéle. Většina pomalých dotazů vzniká kvůli takzvanému N+1 problému: resolver pro jeden typ volá databázi pro každý vrácený záznam zvlášť. Řešením je dávkové načítání (batching) a cache na úrovni requestu. Bez měření skončíte u optimalizace míst, která výkon neovlivní.
Do roku 2026 se stále více prosazuje přístup, kdy se GraphQL vrstva chová jako tenká fasáda nad doménovými službami. To znamená méně logiky v resolverech a více v datové vrstvě, kde lze použít optimalizace specifické pro danou databázi. Zároveň roste tlak na to, aby byly dotazy deterministické a šly dobře cachovat. Pokud se váš dotaz chová pokaždé jinak, cache nepomůže. Zaveďte proto jednotné schéma a vyhněte se dynamickým názvům polí.