PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SQL] Top Verdienste Anzeigen



Masterphil
12.02.2010, 16:05
Hallo an alle, derzeitig optimiere ich Autolose.de ein wenig auf Performance hin damit mein Hoster blos keinen Sress mehr macht.

In meinem Header habe ich eine Anzeige für die Hochvergütetste Werbung eingebaut für derzeitig 3 Werbarten, das wollte ich auf 5 erhöhen, jedoch denke ich mir ist die jetzige Lösung schon so fast der Supergau für meine DB.

Hier mal der aktuelle Befehl:



<? $bbb1 = mysql_fetch_array(db_query("SELECT verdienst FROM ".$db_prefix."_gebuchte_werbung where werbeart = 'forcedbanner' ORDER BY verdienst DESC LIMIT 1")); ?>
<?=@number_format($bbb1['verdienst'] ,0,",",".");?>


Aus meiner Sicht geht der einmal die ganze Werbung durch, schaut in diesem Fall was sind Banner, und sortiert diese um dann den höchsten Wert auszugeben.

Nun habe ich mir auch schon eine Lösung überlegt die eigentlich einfach umzusetzten ist, jedoch fehlt mir mal wieder das PhP und Mysql Wissen dazu.

Daher beschreibe ich mal wie ich es lösen möchte:
Ein Cron soll z.B. stündlich laufen und den obigen Befehl ausführen, den Wert jedoch extra Speichern, entweder in der DB oder direkt in eine Datei. Diese Datei oder Tabelle wird nun ausglesen und von dort aus der Wert für die Anzeige genommen.

Somit liesen sich massig Abfragen in der DB sparen wie ich denke.

Vielleicht hilft mir ja jemand dabei das umzusetzten.

MfG

Xenon
12.02.2010, 16:40
Cron -> DB abfrage (pro werbeart/sponsor) -> db abspeichern -> Jedes mal Neu auslesen
das wäre immerhin schon eine große Erleichterung die du da vorhast, jedoch würde ich dir etwas anderes vorschlagen ...

Den Wert einfach zu Cachen und ihn alle 30 min. Aktualisieren lassen, dann oder 5 min später, wenn der Cron von den Sponsoren gelaufen ist.

30 min ->0 db abfragen -> nach 30 min. fragt er alles ab -> speichert den wert in einer .txt file/oder anderen -> ließt einfach den Wert aus der .txt heraus ...->0 DB abfragen


Das mit dem Cachen ist eigentlich einfach, kannst dir ja vom statsspicker, oder vom top10 mit Addon anschauen ...(Forensuche), dann einfach den teil der fürs cachen verantwortlich ist heraussuchen, bei dir einfügen und fertig.

Parl
12.02.2010, 17:54
Ich pack solche Sachen (auch wenn das nicht die optimale Tabelle ist) mit unter vms_seitenkonfig.

Die Seitenkonfig wird bei jedem Seitenaufruf eh immer komplett ausgelesen, daher hab ich dort z.b. auch den User des Tages, Alle heutigen Geburtstage als array, den Stundenbonus, die aktuelle Anteilsausschüttung, den neuesten User und noch mehr drin.

Man könnte dafür ja die vms_seitenkonfig kopieren in eine neue Tabelle vms_krimskrams z.b. und dort dann für jede Werbeart eine Spalte anlegen und es dann dort ablegen.

jpwfour
12.02.2010, 18:42
EXPLAIN SELECT verdienst FROM vms_gebuchte_werbung where werbeart = 'forcedbanner' ORDER BY verdienst DESC LIMIT 1;Und schon verrät dir MySQL, was es macht, da musst du nicht raten :wink:

"Schöner" ist es, den Maximalen Wert mit der Aggregatfunktion MAX() zu ermitteln, kombiniert mit GROUP BY kann man so auch alle Werbearten auf einmal abfragen:


SELECT MAX( verdienst ) , werbeart
FROM vms_gebuchte_werbung
WHERE menge>0 AND status=1
GROUP BY werbeart
Durch setzen eines geeigneten Index könnte man diese Abfrage optimieren, aber besser ist da die von Parl&Xenon vorgeschlagene Variante, den Wert zwischenzuspeichern, da er sich ja auch nicht so oft ändert.

Masterphil
13.02.2010, 13:56
Danke für eure Hilfe, werde mich bis Montag mal daran probieren mit dem Cachen.

Das man mit setzen geeigneter Indexe auch top optimieren kann weiß ich ja schon lange, aber wie das funktioniert wurde hier noch nie laiengerecht abgehandelt und es wird ja gewarnt es selbst zu machen wenn man keine Ahnung davon hat, daher lasse ich da die Finger von.

MfG