2009-08-24 21 views
1

Ich habe eine Tabelle, in der ich Bewertungen von Benutzern für jedes Produkt speichern. Die Tabelle besteht aus den folgenden Feldern productid, userid, Bewertung (out of 5) ... Diese Tabelle enthält möglicherweise eine Million Zeilen in der Zukunft ....
Also, um die Top 5 Produkte zu wählen, verwende ich die folgende Abfrage ::.MySQL Datenbank-Design?

SELECT productid, avg(rating) as avg_rating 
from product_ratingstblx245v 
GROUP BY productid 
ORDER BY avg(rating) DESC 
LIMIT 5 

Meine Frage ist, da ich auf einigen Seiten meiner Website dieses Ergebnis zeigen, wird, wäre es besser, eine separate Tabelle für die durchschnittlichen Bewertungen mit productid, Felder avgrating, totalvotes zu halten ???

Antwort

1

Tbh, wenn MySql nicht in der Lage war, Abfragen für ein einfaches Tabellenschema wie Ihre oben für mehr als eine Million Datensätze in (Sub-) Millisekunden-Geschwindigkeiten zu behandeln, würde ich mich wirklich fragen, warum Unternehmen es für LOB-Anwendungen verwenden.

So wie es ist, bin ich ein MS Sql Entwickler, also weiß ich nicht wirklich viel über MySql's Fähigkeit. Wenn Sie jedoch davon ausgehen, dass der Database Engine (Datenbankmodul) so gut wie Sql Server ist (ich habe gute Dinge über My Sql gehört), müssen Sie sich nicht um Ihr Leistungsproblem kümmern. Wenn Sie es optimieren möchten, warum nicht die Ergebnisse für 10 Minuten (oder länger) auf Ihrer Anwendungsebene zwischenspeichern? Trigger sind in der Regel rein (wenn auch manchmal notwendig) böse. SQL-Server sind speziell für den Typ der Abfrage konzipiert, die Sie ausführen, Vertrauen in der SQL.

+0

Danke, ich werde dein Wort dafür nehmen, da du ein MS Sql Entwickler bist. und weiter mit der oben genannten Abfrage .... Vielen Dank – halocursed

+0

+1 für den Vorschlag der Zwischenspeicherung der Ergebnisse! Für jede RDBMS-Marke, die Sie verwenden, besteht die beste Verbesserung der Abfrage-Performance darin, die Ausführung der Abfrage zu vermeiden, wenn Sie dies nicht tun müssen. –

3

Sie brauchen die Antwort auf diese Frage noch nicht. Sie können mit einer VIEW beginnen, die das Ergebnis der obigen Abfrage ist. Wenn Sie nach dem Ausführen von Auslastungstests (z. B. mit JMeter) feststellen, dass Ihre Site tatsächlich langsam ausgeführt wird, können Sie die VIEW durch eine TEMPORARY TABLE ersetzen (im Speicher abgelegt). Da die Ansicht und die temporäre Tabelle von außen gleich aussehen, müssen Sie Ihre Geschäftslogik nicht ändern.

1

Persönlich mag ich nicht die Idee, Summen so zu laufen, aber wenn es notwendig wird, dann würde ich den Durchschnitt nicht speichern, würde ich die GESAMTEN ABSTIMMUNGEN und GESAMTBEWERTUNG speichern. Auf diese Weise ist es eine sehr einfache UPDATE-Abfrage (fügen Sie 1 zu TOTAL VOTES hinzu und fügen Sie TOTAL RATING eine Bewertung hinzu). Sie können dann den Durchschnitt in kürzester Zeit berechnen.

Für wie Sie damit umgehen könnten, würde ich einen Auslöser als jemand bereits vorgeschlagen. Aber nur nachdem ich das VIEW-Ding ausprobiert habe, das jemand anderes vorgeschlagen hat.

+0

Oh yeah Ich dachte nur daran, weil die Neuberechnung des Durchschnitts nach jeder Zugabe töricht wäre .... Ich hatte es eilig, also schrieb ich das einfach ... mein böser – halocursed

+0

Joe Ich mag Ihren Ansatz +1 –

Verwandte Themen