2012-04-12 7 views
5

Ich bin derzeit speichern jede Ansicht in der Datenbank mit Benutzer-IP, Datum anzeigen usw. Aber meine Website hat eine große Anzahl von Treffern und es erhöht die Datenbank Sperrzeit und abnehmende Leistung.Beste Ansicht Anzahl Strategie

Ich dachte, die Anzahl in einer Datei für 1 Stunde zu speichern und dann die Datenbank zu aktualisieren, aber jemand sagte mir, dass wir keine Dateioperationen für Schwerlast-Sites verwenden.

Bitte schlagen Sie mir die beste Strategie vor, dies zu tun.

Hinweis: Ich muss die einzigartigen Ansichten nicht zählen.

+0

Ich denke, Transaktionen können gut sein. – hjpotter92

+0

Ist dies für analytische Zwecke? In diesem Fall sollten Sie einen kostenlosen Dienst wie Google Analytics oder Jetpack zum Tracking von Sichten verwenden. –

+0

Soll ich den APC-Cache verwenden, um die Daten zuerst zu speichern und dann nach einigen Ansichten in die Datenbank zu aktualisieren ...? –

Antwort

1

Die Protokolle Ihres Webservers erfassen bereits viele dieser Daten für Sie.

Ich würde vorschlagen, die Protokolle einmal pro Stunde zu rotieren und dann einen geplanten Job zu haben, der die aggregierten Statistiken erzeugt und sie in der Datenbank speichert.

+0

Scheint cool.Ich habe nicht viel Wissen über Server. Kannst du mir bitte sagen, wo ich die Webserver Logs finde? –

+0

Welchen Webserver verwendest du und welches Betriebssystem? –

0

Es sollte kein Problem sein, diese Informationen in MySQL direkt zu speichern und zu aktualisieren. 3000 Treffer pro Stunde bedeuten weniger als eine Abfrage pro Sekunde. Die Verwendung der InnoDB-Speicher-Engine für diese Tabelle sollte Sperrprobleme beheben. Allerdings hat InnoDB viele Optionen und muss richtig konfiguriert werden, um effizient zu arbeiten - das ist wichtig.

Basierend auf Ihre Kommentare Ich denke, die Struktur, die Sie so etwas wie aussehen würde suchen:

id - page id 
type - period length, could be 'day', 'week', 'month' 
period - date when period starts, could be integer written as YYYYMMDD or YYYYMM 
     - depending on the contents of 'type' field 
count - hit count for a url over given period 

Der Primärschlüssel (type, period, id) wäre. Auch Indizes auf (id, period) und auf (type, period, count) für effizient:

SELECT * 
FROM ... 
WHERE type='week' 
    and period = 20120409 
ORDER BY count DESC 

Wenn Seite wird mit Zählung für jede Periode Datensätze einfügen erstellt = 0. Wenn Seite einen Hit wird, führt ein einfaches Update:

UPDATE table 
SET count = count + 1 
WHERE id = $page_id 
    AND period IN (201204, 20120409) 

Es würde alle drei Datensätze für die Statistiken "Tag", "Woche" und "Monat" aktualisieren.

+0

Ich speichere nicht den Typ der Ansicht, sondern berechne den Ansichtstyp nach Datum. Nicht einmal URL als ID reicht in meinem Fall aus. Aber ich aktualisiere Datenbank für jede Ansicht. –

+0

Das Aktualisieren dieser Informationen in jeder Ansicht sollte kein Problem mit nur 1 Seitenansicht pro Sekunde sein. – Mushu

+0

Und wenn Sie ID statt URL verwenden können, wäre URL-Spalte nicht erforderlich. Es würde nur "id" genügen, dass der Seiten-ID-Wert und nicht das automatische Inkrement übertragen würde. – Mushu

0

Es gibt bereits ein Plugin, das dies sehr effektiv macht (obwohl Sie mit den Daten arbeiten müssten, um Posts zu sortieren usw.): BAW Post Views Count. Es speichert alles in postmeta, so ist es leicht zu erreichen, und hält tägliche und andere Summen in separaten Meta-Einträge. Ich benutze es auf mehreren Seiten mit einer Dauer von 50.000 Seitenaufrufen pro Tag und es verlangsamt nichts.

Verwandte Themen