MYSQL Abfrage optimieren

N

NullPeiler

Guest
Hallo

Habe mir ein WMS geschrieben, allerdings sind die MYSQL Teile davon extrem Serverlastig.
Sobald man es etwas stapazirt geht es bös in die Knie.

CODE mysql_query("delete from wms_reload where reload < $time");

$res = mysql_query("SELECT id,link,script,banner FROM wms_banner where status='1' AND klicks >= klicked ORDER BY RAND()");
$a=0;
while ($wms = mysql_fetch_array($res)) {
if(!$reload = @mysql_fetch_array(mysql_query("SELECT * FROM wms_reload where id='".$wms["id"]."' AND ip='".$REMOTE_ADDR."' AND typ='banner'"))) {


Die letzte Zeile mit if am Anfang, hab ma was gehört das select from xxxxxx das man sowas anderst schreiben kann was dan nicht so serverlastig ist, aber wie ?
 
Hallo "NullPeiler"

Du musst versuchen alles mit so wenigen statements wie möglich zu machen. Bei dir wird die Db ja X-mal aufgerufen. Dasa ist nicht gut ;-)
Mit aliasen kannst du tables direkt ansprechen.
Als Beipiel :

from table1 a, table2 b ...

ermöglicht dir einen zugriff beim select :

select a.id, a.column2, a.column3 , b. columnX ...

sowie beim where

where a.id=<someid>, b.columnX='some value'

Einzige voraussetzung ist hierbei eine klare referenz beider tables, wie bei dir scheinbar die beiden ids der tables wms_reload und wms_banner

nun gut .. nehmen wir an du benötigst alle daten beider tables. Zwar wäre es besser ich wüsste die columns aus dem table wms_reload, aber ich nehme hier nun einfach mal BEISPIEL-columns, die du in dem fall bitte bei dir austauschen müsstest.

hier mein code vorschlag :
CODE
$query =
"select b.id, b.link, b.script, b.banner,". // hole die columns aus table1
"r.id, r.column2, r.column3 ". // hole die daten aus table2
"from wms_banner b, wms_reload r ". // setze die aliases b und r
"where b.status='1' AND b.klicks >= klicked ". // setze where für die auswahl table b
"AND r.ip='".$REMOTE_ADDR."' ". // setze where für die auswahl table r
"AND r.typ='banner' ".
"AND r.id=b.id"; // auschluss über die verbindung der id´s von a+r


Das order kannste dir sparen (noch ein zusätzlicher Funktionsaufruf der nicht sein muss)
das zurückgelieferte $result besitzt nun alle daten die du nun mit deiner while durchlaufen kannst.

Ein weiterer Tip : Verhindere bitte in jedem Fall ein select * from ... es ist unübersichtlich und kann auch schnell zu fehlern führen. Für die Datenbank ist es kein unterschied ob du alle benötigten columns in deinem Statement angibst (select coulmn1, column2 ,etc .. from table ...)

HTH
Michael
 
wirklich kapiert hab ichs leider nicht
sad.gif


Hast du vileicht icq msn aim ect ?
 
QUOTE (NullPeiler @ Do 30.11.2006, 18:43) wirklich kapiert hab ichs leider nicht
sad.gif


Hast du vileicht icq msn aim ect ?

mein icq : 234623107

ich muss gleich aber noch zu einem wichtigen termin...
also mit glück erreichst du mich gleich noch.

schick mir doch bitte einmal eine kurze übersicht der beiden tabellen und was dein script in der whileschleife genau macht.

dann kann ich dir genauer helfen

Gruß
michael
 
Zurück
Oben