Ik ben momenteel een gratis website tracker aan het schrijven met behulp van PHP en MySQL, maar ik zit met een probleem. Eén van de onderdelen van de statistieken is een lijst waarin staat hoeveel requests een bepaalde pagina op een bepaalde dag heeft gekregen. Ik heb hier besloten om ook onderscheid te maken tussen verschillende GET requests. Dus deze twee URLs worden als verschillend beschouwd:
topic.php?id=1
topic.php?id=2
Momenteel heb ik een tabel "pagestats" met volgende kolommen:
id (VARCHAR 16, unique key), pageid (INT 10), unix_day (INT 5), pageviews (INT 10), uniques (INT 10). PageID is een numerieke representatie van de URL, die bijgehouden wordt in een aparte tabel "pagelist" om zo de grootte van deze tabel te beperken. ID is de concatenatie van unix_day met een underscore gevolgd door pageid (bijv: 14435_789).
Dit is echter erg omslachtig, op een drukkere site (of een gemiddeld forum) zal de bovenvernoemde tabel ongeveer 102MB groot zijn en +/- 1.000.000 records bevatten na slechts een maand (en dan heb ik nog de tabel waar de URLs omgezet worden naar IDs, die zal ongeveer 20MB groot zijn dan). Ook wordt voor elke gebruiker zo'n tabel aangemaakt, dus als ik enkele klanten heb met drukkere sites is de chaos al meteen compleet.
Hoe kan ik dit efficiënter aanpakken?
Ik heb al zitten denken aan de volgende oplossing, maar ik betwijfel of deze methode beter/sneller is:
De tabel "pagelist" (zie hierboven) maakt nu geen onderscheid meer tussen verschillende GET queries waardoor er al veel minder records in zitten. Vervolgens heeft de "pagestats" tabel twee extra kolommen:
queries_pageviews (BLOB of TEXT of ?);
queries_uniques (BLOB of TEXT of ?);
Deze kolommen bevatten elk een geserializede Array:
$querystats_pageviews[$querystring]=(INTEGER);
$querystats_uniques[$querystring]=(INTEGER);
$querystring is de GET request, dus bijvoorbeeld: "topic=3&page=2" of "search=Hallo&resultsperpage=100". en de INTEGER is het aantal.
Ik heb echter geen idee of deze oplossing enig voordeel biedt op het vlak van performance tegenover de eerstgenoemde oplossing.
Alvast bedankt,
DePhille
topic.php?id=1
topic.php?id=2
Momenteel heb ik een tabel "pagestats" met volgende kolommen:
id (VARCHAR 16, unique key), pageid (INT 10), unix_day (INT 5), pageviews (INT 10), uniques (INT 10). PageID is een numerieke representatie van de URL, die bijgehouden wordt in een aparte tabel "pagelist" om zo de grootte van deze tabel te beperken. ID is de concatenatie van unix_day met een underscore gevolgd door pageid (bijv: 14435_789).
Dit is echter erg omslachtig, op een drukkere site (of een gemiddeld forum) zal de bovenvernoemde tabel ongeveer 102MB groot zijn en +/- 1.000.000 records bevatten na slechts een maand (en dan heb ik nog de tabel waar de URLs omgezet worden naar IDs, die zal ongeveer 20MB groot zijn dan). Ook wordt voor elke gebruiker zo'n tabel aangemaakt, dus als ik enkele klanten heb met drukkere sites is de chaos al meteen compleet.
Hoe kan ik dit efficiënter aanpakken?
Ik heb al zitten denken aan de volgende oplossing, maar ik betwijfel of deze methode beter/sneller is:
De tabel "pagelist" (zie hierboven) maakt nu geen onderscheid meer tussen verschillende GET queries waardoor er al veel minder records in zitten. Vervolgens heeft de "pagestats" tabel twee extra kolommen:
queries_pageviews (BLOB of TEXT of ?);
queries_uniques (BLOB of TEXT of ?);
Deze kolommen bevatten elk een geserializede Array:
$querystats_pageviews[$querystring]=(INTEGER);
$querystats_uniques[$querystring]=(INTEGER);
$querystring is de GET request, dus bijvoorbeeld: "topic=3&page=2" of "search=Hallo&resultsperpage=100". en de INTEGER is het aantal.
Ik heb echter geen idee of deze oplossing enig voordeel biedt op het vlak van performance tegenover de eerstgenoemde oplossing.
Alvast bedankt,
DePhille