Sjednocení dotazů z routeru (NotORM)
- m4rty
- Člen | 40
Zdravím, potřeboval bych poradit.
Napsal jsem si vlastní databázový router. Pro každý odkaz na stránce se hledá v databázi id aktuální stránky (ve funkci constructUrl()). Je možné nějakým způsobem tyto dotazy sloučit? Zjistil jsem, že Jakub Vrána vyvíjí NotORM2. Nahrál jsem si tedy tuto verzi (then branch), ale nevím jestli ji pro toto můžu nějakým způsobem použití.
Díky před za rady.
- Panda
- Člen | 569
Nedovedu si představit, jak by všechny dotazy šly sloučit už na úrovni routeru (router musí vrátit odkaz „teď“, nemůže čekat, jestli náhodou nebude ještě jeden odkaz). Na druhou stranu si ale dokážu dost dobře představit, že na úrovni routeru hodíš cache s kompletní překladovou tabulkou, kterou budeš pomocí tagů invalidovat při změně/přidání stránky a router se bude dotazovat databáze jen jednou za čas.
- m4rty
- Člen | 40
Ja mam totiz jednu spolecnou tabulku, kde mam obsazene informace o vsech zaznamech z databaze (url,nazev) a z te take generuji odkazy. Myslim ze by to bylo velmi narocne pokud bych mel ulozeno napr. 3000 clanku. Uz jsem to mel udelane jak rikas, ale vyhovuje mi vic aktualni reseni, protoze se zaznamy z DB budou casto menit. Akorat jsem tedy nedoresil jak udelat nejaky lazy loading na sjednoceni dotazu a volani najednou.
- Panda
- Člen | 569
Tento postup jsem zkoušel pro 1000 záznamů a nezaznamenal jsem žádný
velký rozdíl ve výkonu. Pokud se chceš vyhnout velkým polím v cache, tak
to rozděl podle IDčka do několika položek, tzn. články s ID 1 –
999 ukládej do cache pod názvem table-0
, ID 1000 – 1999 pod
názvem table-1
atd. Dá se předpokládat, že na jedné stránce
budou články vždy zhruba ze stejné doby a tak se Ti načtou jen 1 –
2 tabulky.
Na méně než 1000 záznamů podle mě nemá moc smysl cache členit, nejhorší je na celém procesu ten diskový přístup. Pokud bys to chtěl ještě víc optimalizovat, tak memcache a s tou granularitou si trochu pohrát.
Co znamená „záznamy se budou často změnit“? Bude to častěji, než jednou za několik minut? Pokud ne, tak je cache lepší řešení. Invalidace cache zabere chvilku déle, ale děje se jen jednou za čas, kdežto odkazů na stránce mohou být i desítky.
// Doplnění: koukám, že než jsem post odeslal, tak už bylo rozhodnuto… :-) Snad to ale trošku pomůže ostatním při rozhodování.
Editoval Panda (2. 4. 2012 13:03)