Seite 1 von 1

SQL Abfrage läuft nicht optimal

Verfasst: 21.03.2007 16:58
von elconde
Hallo,

ich habe vor kurzer Zeit meinen Provider gewechselt und seitdem läuft das Portal nicht mehr schnell, weil eine Abfrage für die aktuellsten 5 Threads aus dem Forum das ganze ausbremst. Nun würde ich gerne wissen, wo der Fehler liegen kann, wenn es beim alten Provider ganz normal geklappt hat. Ohne die Abfrage der neusten Threads läuft das Portal (noch in der bauphase) ganz normal schnell.

Hier ist der Code für die Abfrage. Vielleicht hilft es ja. Das Forum ist auf dem neusten Stand.

Code: Alles auswählen

<?PHP
	 //forum.php
	
	 $limit=5; // Maximal angezeigte Anzahl der Threads
	 $count=1; // hier wird losgezählt
	 $topic_id=1; // der erste Thread fällt mal zum raus, um die Variable zu haben
	 $array=array();
	 $array_var="topic_id not like 1";
	 
	 // DB Connect	
	 [gelöscht]
	 
	 // Aktuelle Posts holen
	 #$get_posts=mysql_query("SELECT post_id, topic_id, forum_id, poster_id, FROM_UNIXTIME( (post_time), '%d.%m.%Y - %H:%i' ) AS datum FROM `phpbb_posts` ORDER BY post_id DESC LIMIT 1 " );
	 
	 // Spezifikation der Einträge
	 
	 while($count<=$limit){
	 	if($topic){
	 	$topic_id=$topic;
	 	$array[$count]=$topic;
	 	$array_var=$array_var." and topic_id not like ".$array[$count];
	 	}		
	// Aktuelle Posts holen
	$get_posts=mysql_query("SELECT post_id, topic_id, forum_id, poster_id, FROM_UNIXTIME( (post_time), '%d.%m.%Y - %H:%i' ) AS datum FROM `phpbb_posts` where $array_var ORDER BY post_id DESC LIMIT 1 " );
	 while($row = mysql_fetch_object($get_posts)){
	 	
	 	 $poster = $row->poster_id;
	 	 $forum = $row->forum_id;
	 	 $topic = $row->topic_id;
	 	 $linkid = $row->post_id;
	 	 $datum = $row->datum;
	 	 
	 	 // Abfrage des Poster-Name
	 	 $get_poster=mysql_query("SELECT username FROM `phpbb_users` WHERE user_id = $poster ");
	 	 $row1 = mysql_fetch_object($get_poster);
	 	 $poster_name=$row1->username;
	 	 
	 	 // Abfrage des Foren-Name
	 	 $get_forum=mysql_query("SELECT forum_name, cat_id FROM `phpbb_forums` WHERE forum_id = $forum");
	 	 $row2 = mysql_fetch_object($get_forum);
	 	 $forum_name=$row2->forum_name;
	 	 $cat_id=$row2->cat_id;
	 	 
	 	  // Abfrage der Kategorie (Hauptstudium/Grundstudium...)
	 	 $get_cat=mysql_query("SELECT cat_title FROM `phpbb_categories` WHERE cat_id = $cat_id");
	 	 $row5 = mysql_fetch_object($get_cat);
	 	 $cat_name=$row5->cat_title;
	 	 
	 	 // Abfrage des Thread-Name
	 	 $get_thread=mysql_query("SELECT topic_title FROM `phpbb_topics` WHERE topic_id = $topic");
	 	 $row3 = mysql_fetch_object($get_thread);
	 	 $Titelvar=$row3->topic_title;
	 	 
	 	 // Abfrage der Antworten für den jeweiligen Thread
	 	 $get_answer=mysql_query("SELECT topic_replies FROM `phpbb_topics` WHERE topic_id = $topic");
	 	 $row4 = mysql_fetch_object($get_answer);
	 	 $Answervar=$row4->topic_replies;
	 	 
	 	 // Abfrage, ob Beitrag von "Heute" ist...
	 	 $zwischenspeicher1 = $row->datum;
	 	 $zwischenspeicher2 = substr($zwischenspeicher1, 0, -8);
	 	 $heute = date("d.m.Y");
	 	 if ($heute == $zwischenspeicher2){
	 	 	$zwischenspeicher3 = substr($zwischenspeicher1, 10);
	 	 	$datum = "<i><b>heute</b></i>".$zwischenspeicher3;
	 	 }
	// Abfrage der Anzahl der Einträge des aktuellen Datums
	
	$get_number=mysql_query("SELECT COUNT(post_id) AS anzahl, CURDATE() AS today FROM phpbb_posts WHERE FROM_UNIXTIME(post_time, '%Y-%m-%d') = CURDATE() GROUP BY FROM_UNIXTIME(post_time, '%Y-%m-%d') " );
	$number = "Null";
	while($zeile = mysql_fetch_object($get_number)){
	$number = $zeile->anzahl;	
	} // aktuell
	
	// Abfrage der Anzahl der Einträge des Vortages
	
	$tstamp  = mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));
	$gestern = date("Y-m-d", $tstamp);  // ISO-8601 Format
	
	$get_number_y=mysql_query("SELECT COUNT( post_id )  AS anzahl, CURDATE(  )  AS today FROM phpbb_posts WHERE FROM_UNIXTIME( post_time,  '%Y-%m-%d'  )  = '$gestern'" );
	$number_y = "Null";
	while($zeile1 = mysql_fetch_object($get_number_y)){
	$number_y = $zeile1->anzahl;	
	} // Vortag
	
		 if (strlen($Titelvar) > 45)
		 $Titelvar = substr($Titelvar, 0, 45)."...";
	 	 
	 	 // Ausgabe in html
	 	 echo "<div id=\"start_last_entries\"><a href=\"http://www.campuszentrale.de/uni-kiel/forum/viewtopic.php?p=".$linkid."#".$linkid."\" class=\"special_link\">".$Titelvar."</a><br> 
	 	 Forum: <a href=\"http://www.campuszentrale.de/uni-kiel/forum/viewforum.php?f=".$forum."\">[".$forum_name."] </a><br>Kategorie: <b>".$cat_name."</b><br> 
	 	  am: ".$datum." von: ".$poster_name." || AW: ".$Answervar."<div id=\"linie\"></div>
	 	 </div>";
	}	

	$count++;
	}// while(count)  	
	echo "<div id=\"anzahl_beitraege\">";
	echo "Beitr&auml;ge <i><b>heute:</b></i>&nbsp&nbsp&nbsp ".$number."";
	echo "<br>Beitr&auml;ge <i><b>gestern:</b></i> ".$number_y."";
	echo "</div>";
	
	 //für das Auswahlformular
	 $morgen=mktime(0, 0, 0, date(m), date(d)+1, date(y));
	 $heute=mktime(0, 0, 0, date(m), date(d), date(y));
	 $gestern=mktime(0, 0, 0, date(m), date(d)-1, date(y));
	 $vorgestern=mktime(0, 0, 0, date(m), date(d)-2, date(y));
	 $pruefvar = "nein";
?>
	<div id="alle_beitraege">	
			<form action="index.php?section=forum_dropdown" method="post">
				<select class="dropdown_entry" name="url" onchange="this.form.submit()" >
				<option class="dropdown_entry" value="<? echo $heute ?>" selected>Alle Eintr&auml;ge anzeigen von:</option>
				<option class="dropdown_entry" value="<? echo $heute ?>">Heute</option>
				<option class="dropdown_entry" value="<? echo $gestern ?>">Gestern</option>
				<option class="dropdown_entry" value="<? echo $vorgestern ?>">Vorgestern</option>
				<option class="dropdown_entry" value="<? echo "noanswer"; ?>">UNBEANTWORTETE</option>
				</select>
			</form>
		</div>
Bin für jeden Tip dankbar!

Gruß
Alex

Verfasst: 22.03.2007 01:56
von cYbercOsmOnauT
Ich habe Deinen Code jetzt nur überflogen, aber ich sehe da ganz schön viele Queries und frage mich, ob das wirklich so nötig ist.

Wieso nimmst net den Code von Smartors eZPortal? Der zeigt doch auch die 5 neuesten Themen an, oder habe ich da was falsches in Erinnerung? (Tip: Nimm bloß net den Code vom Intro+Portal Mod, der bremst das Board bei vielen Postings aus).

Grüße,
Tekin

Verfasst: 22.03.2007 07:52
von elconde
danke. ich habe auch schon ein paar gute mods gesehen, die ich so einsetzten kann. mein abfrage ist schon sehr schlecht (keine joins), aber es war auch das erste mysql skelett meiner coder karriere :-)