Skaah schreef op 25 juni 2004 @ 09:52:
[...]
Dat hoort je databeest te cachen, en dat doet MySQL dan ook. Ik heb hier een keer mee geëxperimenteerd, 3000 queries, waarvan 600 dubbele, op de database afgevuurt mét en zonder caching van PHP (gewoon, in één pagina, dus in het geheugen). Het scheelde ongeveer 10% in het voordeel van PHP cachen (Athlon XP 2600+ / 1024MB DDR400, Windows XP / Apache 1.3 / MySQL 3.x / PHP 4.3.3). Die winst raak je gemakkelijk kwijt door de overhead van het inlezen van een bestand en kijken of je query al een keer gecached is.
Dan is dat baggerslechte caching in PHP of je hebt heel foute benchmarks gedaan. Goede in-memory caching is vanzelfsprekend tig keer sneller dan opnieuw de hele query compileren, de data induiken en alles opnieuw verzamelen. Zelfs al is de hele resultset gecached sla je nog de lookup stap van de database en een rits IPC over als je de hele dataset kant en klaar preformatted in je DAL hebt hangen. Dat is ook 1 van de grote voordelen van een DAL: als je updates en selects door dezelfde abstractielaag trekt kun je aannames maken over wanneer je cache al of niet dirty is, wat je een stuk intelligenter kunt doen dan de database zelf.
Met complexe queries, en tig joins en views is er in de extreemste gevallen tegen SQL Server vanuit een middle tier meer dan 50% winst realiseerbaar kan ik uit ervaring melden: en SQL Server cached slimmer dan MySQL, geloof me.
Cachen in files lijkt me een stuk langzamer dan een database, en een stuk complexer. En om nou het hele shared-mem vol te stoppen met caches, voelt IMHO ook niet helemaal fijn.
Waarvoor stop je dan al dat geheugen in zo'n server?

Indien de DAL en DB op dezelfde server draaien is er nog iets te zeggen, maar zelfs dan nog is het twijfelachtig in hoeverre je puur en alleen de DB aan het cachen wil hebben, omdat je als applicatie simpelweg veel betere aannames kunt maken en voorspellingen kunt doen over de 'houdbaarheid' en 'use frequency' van de te selecteren data.
Chem's voorbeeld van de forumlist-dropdown's is een perfect voorbeeld: rarely to never updated, required every page. Wat denk je dat de snelste code is (ik pak even C#/ASP.NET):
C#:
1
2
3
4
5
6
7
8
| if((int)Cache["ForumListSequenceNr"] != (int)Session["ForumListSequenceNr"])
{
// Synchronize sequence first to avoid having to lock
Session["ForumListSequenceNr") = Cache["ForumListSequenceNr"];
Session["ForumList") = AssembleUserSpecificForumList();
}
foreach(DictionaryEntry entry in (StringDictionary)Session["ForumList"])
Response.Write("<option id=\"" + entry.Key + "\">" + entry.Value + "</option>"; |
Denk je echt dat deze code langzamer wordt als je iedere keer de AssembleUserSpecificForumList functie aanroept die een select met bijbehorende locking en query compilation of execution plan lookup moet doen over een IPC pijpje naar de database?
[
Voor 18% gewijzigd door
curry684 op 25-06-2004 10:30
]