PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage noch weiter optimierbar?



schulz3000
16.06.2007, 01:10
Hallo
ich habe folgende SQL-Abfrage die forcedbannerdaten ausliest die für die abfrufende ip nicht im reload sind.



SELECT f1.image,f1.tan,f1.verdienst,f1.menge FROM forced f1 LEFT JOIN reload f2 ON f1.tan=f2.tan AND f2.ip='".$_SERVER[REMOTE_ADDR]."' WHERE f1.status=1 AND f1.menge>'50' AND f2.tan IS NULL ORDER BY f1.verdienst DESC


Die Abfrage liefert das gewünschte Ergebnis.
Jetzt meine Frage an die sql-Cracks unter euch: Wie kann ich die Abfrage noch optimieren das sie noch schneller und CPU-schonender abläuft?

Danke schonmal für die Antworten

SebbyPHM
16.06.2007, 13:14
Beachte, dass Du die Bedingungen welche am ehesten erfüllt sind, am Anfang einer Where-Klause schreiben solltest. Setze also z.B. f2.tan IS NULL am Anfang und den Rest dort hinter. Und Konformer ist es, wenn du nicht tabelle kz sondern tabelle AS kz schreibst.

plopp
18.06.2007, 00:21
Hast du Indexe gesetzt? Die machen mächtig was aus.
Am Besten im phpmyadmin in Ruhe (am Besten Testsystem) ausprobieren. Man kann da auch mächtig was falsch machen.
Die Laufzeit an sich bekommt man mit explain.
Hab durch Setzen von Indexen die Abfragen von teilweise über 30 Sekunden auf unter 1 Sekunde bekommen. Auch Empfehlungen hier im Forum passen nicht immer so gut. Habe mit meinem Hoster mächtig Ärger bekommen, als ich in "gebuchte Werbung" und "reloads" die Indexe wie hier im Forum empfohlen gesetzt hatte ;)

breaker
03.08.2007, 21:48
Man sollte schon wissen, was der Code, den man einbaut bewirkt.....und nicht Blind irgendwas einbauen ;)

Auf die art bin ich vom Code (Version 1) :



$sql1=mysql_query("SELECT
ba.kampagnen_id,
ba.kampagnen_werbemittel_id,
ba.kampagnen_name,
ba.kampagnen_reload,
ba.kampagnen_aufenthalt,
ba.kampagnen_url,
ba.kampagnen_url_bild,
ba.kampagnen_art,
ba.kampagnen_sponsor
FROM ".$prefix."_pwc_banner_ads AS ba
LEFT JOIN ".$prefix."_pwc_banner_ads_reload AS re
ON ba.kampagnen_id=re.kampagnen_id
AND ba.kampagnen_sponsor=re.kampagnen_sponsor
AND ba.kampagnen_art=re.kampagnen_art
AND re.kampagnen_klick<='".intval($time)."'
ORDER BY RAND() LIMIT 1
") or die (mysql_error());




nach :




$sql1=mysql_query("SELECT
kampagnen_id,
kampagnen_werbemittel_id,
kampagnen_name,
kampagnen_reload,
kampagnen_aufenthalt,
kampagnen_url,
kampagnen_url_bild,
kampagnen_art,
kampagnen_sponsor
FROM ".$prefix."_pwc_banner_ads
WHERE ".$prefix."_pwc_banner_ads.kampagnen_id
NOT IN (SELECT ".$prefix."_pwc_banner_ads_reload.kampagnen_id FROM ".$prefix."_pwc_banner_ads_reload)
AND kampagnen_art = '1'
AND kampagnen_status = '1'
ORDER BY RAND() LIMIT 1
") or die (mysql_error());





gekommen, bis mir der Kragen geplatz ist und ich die komplette DB neu angelegt habe, dort wurden je Tabelle 3 PKs angelegt und dieser ode entwickelt :



$sql1=mysql_query("SELECT
kampagnen_id,
kampagnen_werbemittel_id,
kampagnen_name,
kampagnen_reload,
kampagnen_aufenthalt,
kampagnen_url,
kampagnen_url_bild,
kampagnen_art,
kampagnen_sponsor
FROM ".$prefix."_pwc_banner_ads ba
WHERE 0 = (SELECT COUNT(*) FROM ".$prefix."_pwc_banner_ads_reload re
WHERE ba.kampagnen_id = re.kampagnen_id
AND ba.kampagnen_werbemittel_id = re.kampagnen_werbemittel_id
AND ba.kampagnen_art = re.kampagnen_art
AND ba.kampagnen_sponsor = re.kampagnen_sponsor
AND re.kampagnen_ip = '".addslashes(htmlspecialchars($user_ip))."'
AND re.kampagnen_klick >= '$time'
)
AND ba.kampagnen_art = 1
AND ba.kampagnen_status = 1
ORDER BY RAND() LIMIT 1
");