Frage

Ich habe eine Seite, wo die Benutzer eine recht große Anzahl von Stellen anzeigen können. Jedes Mal, dies geschieht ich eine Abfrage ähnlich wie UPDATE table SET views=views+1 WHERE id = ? laufen. Es gibt jedoch eine Reihe von Nachteilen dieses Ansatzes:

  • Es gibt keine Möglichkeit der Verfolgung, wenn die Seitenzugriffe auftreten -. Sie sind einfach erhöht
  • die Tabelle aktualisieren, die oft wird, soweit ich es verstehe, den MySQL-Cache der Zeile löschen, damit die nächste SELECT dieser Reihe machen langsamer.

Deshalb halte ich einen Ansatz beschäftigen, in denen ich eine Tabelle zu erstellen, sagen:
object_views { object_id, year, month, day, views }, so dass jedes Objekt eine Zeile pr hat. Tag in dieser Tabelle. Ich würde dann in regelmäßigen Abständen die Ansichten Spalte in der Tabelle objects aktualisieren, so dass ich nicht teuer tun, müsste schließt sich die ganze Zeit.

Dies ist die einfachste Lösung die ich denken kann, und es scheint, dass es auch derjenige mit der geringsten Auswirkungen auf die Leistung ist. Stimmen Sie zu?

(Die Seite ist baut auf PHP 5.2, symfony 1.4 und Lehre 1.2, falls Sie sich wundern)

Bearbeiten
Der Zweck ist, nicht Web-Analyse - ich weiß, wie das zu tun, und das ist bereits vorhanden. Es gibt zwei Zwecke:

  • erlaubt es den Benutzer, um zu sehen, wie oft ein bestimmtes Objekt zum Beispiel heute oder gestern gezeigt wurde.
  • Lassen Sie die Moderatoren der Website zu sehen, einfach Statistiken anzeigen, ohne in Google Analytics, Omniture oder was auch immer Lösung. Darüber hinaus müssen die Ergebnisse im Backend in Echtzeit, eine Funktion Weicht GA kann zu diesem Zeitpunkt nicht bieten. Ich möchte nicht den Analytics API verwenden, um die Verbrauchsdaten abgerufen wird (nicht in Echtzeit, GA benötigt Javascript).
War es hilfreich?

Lösung

Zitat: Die Aktualisierung der Tabelle, die oft wird, soweit ich es verstehe, den MySQL-Cache der Zeile zu löschen, damit die nächste SELECT dieser Reihe langsamer zu machen.
Es ist viel mehr als das. Dies ist Datenbank-Killer. Ich schlage vor, u Tabelle wie folgt machen: object_views {object_id, Zeitstempel} So können Sie auf object_id aggregieren (count () Funktion). So sieht jedes Mal, wenn jemand die Seite, die Sie Datensatz in der Tabelle einfügen werden. Hin und wieder müssen Sie die alten Aufzeichnungen in der Tabelle reinigen. UPDATE-Anweisung ist SCHLECHT :) Auf den meisten Plattformen wird es markieren grundsätzlich die Zeile als gelöscht und legen damit eine neue Tabelle der fragmentierten machen. Ganz zu schweigen von Fragen zu verriegeln.

Ich hoffe, das hilft

Andere Tipps

In der gleichen Richtung wie Wut, Sie gehen einfach nicht die gleichen Ergebnisse bekommen es selbst zu tun, wenn es eine Million dritten Protokoll-Party-Tools gibt. Wenn Sie auf einer täglichen Basis verfolgen, dann ein Basisprogramm wie Webtrends der Verfolgung der Treffer durchaus in der Lage ist, vor allem, wenn Ihre URL die IDs der Elemente enthält, die Sie verfolgen möchten ... Ich kann nicht genug betonen, es ist alles die URL zu, wenn es darum geht, diese Tools (Wordpress zum Beispiel ermöglicht, viele verschiedenen URL-Konstrukte)

Wenn Sie nun in „Eindruck“ suchen Tracking dann ein anderes Ballspiel ist es, weil Sie wahrscheinlich jedes Objekt verfolgen, die Seite, die Benutzer und möglicherweise gewichtete Wert basierend auf Position auf der Seite. Wenn dies der Fall ist, können Sie Ihre Leistung Schritt halten mit dem Tracking auf einem anderen Server-Hosting, wo Sie feuern und vergessen. In der Vergangenheit habe ich diese mit SQL-Aktualisierung gegen die ID und eine String-Version des Datums ... auf diese Weise, wenn das Datum wechselt 20091125 bis 20091126 es ohne den Aufwand eine einfache Abfrage ist die von lassen eine datediff Funktion sagen.

Zuerst nur eine kurze Bemerkung, warum das Jahr nicht aggregieren, Monat, Tag in DATETIME, würde es mehr Sinn in meinem Kopf machen.

Auch ich bin nicht wirklich sicher, was der genaue Grund ist, dass Sie das tun, wenn es für eine Marketing / Web-Statistik Zweck Sie besser haben Werkzeug für diesen Zweck zu verwenden.

Jetzt gibt es zwei große Familie von Werkzeug, das Ihnen eine Vorstellung von Ihrer Website Zugriffsstatistiken zu geben, basiert ein log ( awstats ist wahrscheinlich der beliebteste), ajax / 1pixel Bild anhand eines ( analytics google wäre die beliebteste).

Wenn Sie Ihre eigene Statistik-Datenbank bauen Sie wahrscheinlich verwalten können ein Protokoll-Parser leicht mit PHP zu bauen. Wenn Sie Apache-Logs finden Parsen (oder IIS-Protokolle) zu viel belasten, würden Sie wahrscheinlich Ihre Anwendung ouput einige benutzerdefinierte Protokolle auf einfachere Art und Weise formatiert werden.

Auch eine andere mögliche Lösung zu verwenden ist Memcached , bietet der Dämon eine Art Zähler, den Sie mit Zuwachs . Sie können Ansicht dort anmelden und ein Skript, das Ergebnis jeden Tag zu sammeln.

Wenn Sie vorhaben, das zu tun, warum nicht nur jeden Zugriff anmelden? MySQL kann sehr gut Einsätze in kontinuierlichen Tabellen-Cache, so sollte es nicht eine bemerkenswerte Verlangsamung aufgrund des Einsatzes sein. Sie können immer laufen Profile anzeigen um zu sehen, was die Leistungseinbuße tatsächlich ist.

Auf der Datetime-Ausgabe, können Sie immer GROUP BY MONTH( accessed_at ) , YEAR( accessed_at) oder WHERE MONTH(accessed_at) = 11 AND YEAR(accessed_at) = 2009 verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top