Použijte vestavěnou mezipaměť dotazů MySQL místo toho, abyste se ji snažili udržovat sami. Automaticky vymaže dotazy uložené v mezipaměti do tabulek, když jsou do nich zapsány. Navíc funguje v paměti, takže by měl být velmi efektivní...
Také neukládejte pouze dotazy do mezipaměti. Zkuste ukládat do mezipaměti celé segmenty aplikace v různých fázích cyklu vykreslování. Takže můžete nechat MySQL ukládat dotazy do mezipaměti, pak ukládat do mezipaměti každý jednotlivý pohled (renderovaný), každý jednotlivý blok a každou stránku. Poté si můžete na základě požadavku vybrat, zda chcete nebo nechcete stahovat z mezipaměti.
Nepřihlášený uživatel může například získat celou stránku přímo z mezipaměti. Přihlášený uživatel však nemusí být schopen (kvůli uživatelskému jménu atd.). Takže pro něj můžete být schopni vykreslit 1/2 vašich zobrazení na stránce z mezipaměti (protože nezávisí na objektu uživatele). Stále budete mít výhodu ukládání do mezipaměti, ale bude odstupňováno podle potřeby.
Pokud očekáváte opravdu velký provoz, rozhodně stojí za to podívat se na Memcached
. Nechte MySQL ukládat vaše dotazy za vás a poté ukládat všechny položky mezipaměti uživatele do memcache...
Upravit: Odpověď na vaši úpravu:
Souborové systémy se mohou zpomalit, pokud se jeden adresář zvětší. Dokud "rozdělujete" podle adresáře (takže každý adresář má pouze malou část souborů mezipaměti), měli byste být z tohoto hlediska v pořádku. Pokud jde o přesný práh, bude opravdu více než na čemkoli jiném záviset na vašem hardwaru a souborovém systému. Vím, že EXT3 se dost zpomaluje, pokud je v jednom adresáři spousta souborů (mám adresáře doslova se stovkami tisíc souborů a jednoduše stat()
může trvat až půl sekundy jeden ze souborů, natožpak provést jakýkoli druh výpisu adresáře)...
Ale uvědomte si, že pokud přidáte další server, budete mít buď duplikaci mezipaměti (což není dobrá věc), nebo budete muset přepsat celou vrstvu mezipaměti. Existuje důvod, proč nechodit s Memcached
hned od začátku?
Úprava 2: Odpověď na vaši poslední úpravu:
Stále je příliš těžké zavolat. Mám aplikaci, která má databázi s přibližně 1,5 miliardami řádků (rostoucí rychlostí přibližně 500 000 za den). Nepoužíváme na něm vůbec žádné ukládání do mezipaměti, protože nemáme problémy se souběžností. A i kdybychom to udělali, bylo by lepší, kdybychom do toho přidali více serverů MySQL, než abychom přidávali mezipaměť, protože jakákoli forma mezipaměti by měla tak nízkou míru návštěvnosti, že by se nevyplatilo ji přidávat.
A to je důvod, proč jsem tak skálopevně přesvědčen o tom, že kvůli rychlosti neukládám do mezipaměti. Vždy bude existovat objekt, který není v mezipaměti. Pokud tedy narazíte na stránku s jedním z těchto objektů, stále musí být rychlý. Obecně platí, že se snažím ukládat do mezipaměti vše, co bude znovu zpřístupněno v příštích několika minutách (stejně v jiných aplikacích udržuji dobu života asi 5 minut ve výrobě). Pokud tedy položky v daném časovém období nezískají více než několik přístupů nebo je četnost výskytu velmi nízká (méně než 90 %), neobtěžuji se s ukládáním této položky do mezipaměti....