phpbar.de logo

Mailinglisten-Archive

zu grosses result set?
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

zu grosses result set?



Hi :)

Ich habe hier ein merkwuerdiges Problem mit PHP und MySQL. Seit
einiger Zeit sammle ich Daten ueber die abgerufenen Artikel in einer
Tabelle und fuehre darueber Abfragen aus um die Top-Artikel in
bestimmten Zeitraeumen zu ermitteln und auch um Related Articles
anzuzeigen. Das funktioniert, ist allerdings extrem langsam (die
Tabellen haben Indizes). Ich habe eine Funktion geschrieben, die
"Lesercharts" ausgibt. Die funktioniert ebenfalls, gibt allerdings
seit gestern bei einem bestimmten select ein leeres Ergebnis aus (es
kommt also keine Fehlermeldung, er gibt nur einfach nichts aus).

Eigentlich sollte die MYSQL dabei nur 20 Zeilen ausgeben, die jeweils
kaum Inhalt haben. Dafuer muessen allerdings ein paar mehr Datensaetze
durchforstet werden. Momentan sind es 120000. Die einzelnen Felder,
die hier im Where auftauchen, haben Indexe. Dennoch ist es ziemlich
langsam. Kann es sein, dass es fuer die MySQL zu gross ist?

Der Aufruf der funktioniert sieht so aus:

$resultdatum = MYSQL_QUERY("select date_sub(now(),interval 90 day)");
$datum = mysql_result($resultdatum,0);
lesercharts("select artikelid,count(*) as anzahl from personalize
where datum > '$datum' and tabelle='stories' group by artikelid order
by anzahl desc limit 0,10","10","Top-Stories","ermittelt aus den
abgerufenen Stories der letzten 90 Tage","select band as band,band as
titel,autor as autor,datum as datum,intro as review from
stories","stories");

Der Aufruf der nicht funktioniert sieht so aus:

$resultdatum = MYSQL_QUERY("select date_sub(now(),interval 7 day)");
$datum = mysql_result($resultdatum,0);
lesercharts("select artikelid,count(*) as anzahl from personalize
where datum > '$datum' and tabelle='cdreviews' group by artikelid
order by anzahl desc limit 0,20","20","Aktuelle
Lesercharts","ermittelt aus den abgerufenen CD-Reviews der letzten 7
Tage","select band as band,titel as titel,autor as autor,datum as
datum,review as review from cdreviews","cdreviews");



Und hier die Funktion
Insgesamt werden erst die Datensaetze aus der
Personalisierungs-Tabelle ausgewaehlt und dann werden zu jedem
Datensatz aus den anderen Tabellen die benoetigten Informationen zur
Anzeige ausgesucht (also erst Tabelle und Artikel-ID, dann anhand
dieser Informationen Interpret usw.).


function
lesercharts($query,$number,$tabletitle,$tablecomment,$query2,$bereich)
 {
	// query: Datenbankabfrage fuer personalize-Datenbank
	// number: Anzahl der Datensaetze
	// tabletitle: Titel fuer Tabelle
	// tablecomment: Kommentar fuer Tabelle
	// query2: Datenbankabfrage fuer Ausgabe (Titel usw. auslesen anhand
der ID aus der ersten Abfrage)
		// band, titel, autor, datum, punkte, review stehen zur Verfuegung

	global $tablebordercolor;
	global $tablebgcolor;
	global $server;

	// Jeder Bereich verfuegt ueber eigene Dateien und Parameter. Dies
wird hier festgelegt.
	if ($bereich=="cdreviews") {
		$aufruf="cdreviews.php3?was=review&id=";
	} else if  ($bereich=="stories") {
		$aufruf="stories.php3?was=story&id=";
	} else if  ($bereich=="livereviews") {
		$aufruf="live.php3?was=review&id=";
	} else if  ($bereich=="forum") {
		$aufruf="read.php3?id=";
	} else if  ($bereich=="portal") {
		$aufruf="jump.php3?id=";
	}

	?>
	<center>
	<table border="0" cellspacing="0" cellpadding="0"
width="90%"><tr><td>
	<table width="100%" border="0" cellspacing="0" cellpadding="0">
		<tr>
			<td class="strichrot" valign="MIDDLE"><b><font
face="Arial,Helvetica,sans-serif" size="3" color="#e7e7e7"><? print
"$tabletitle"; ?></font></b></td>
		</tr>
	</table>
	</td></tr>
	<tr><td><br></td></tr>
	<tr><td bgcolor="#<? echo $tablebordercolor; ?>">
	<table width="100%" border="0" cellspacing="1" cellpadding="6">
		<tr bgcolor="#<? echo "$tablebgcolor"; ?>">
			<td>
	<table width="100%">

	<?
	print "<tr><td colspan=\"5\"><font size=\"1\"
face=\"Arial,Helvetica,sans-serif\">($tablecomment)</font></td></tr>";
	$result = MYSQL_QUERY($query);
  $checknumber = MYSQL_NUMROWS($result);
  if ($checknumber<20) {
    $number=$checknumber;
  }
	$i=0;
	while ($i<$number) {
		$artikelid = mysql_result($result,$i,"artikelid");
			$resultartikel=mysql_query($query2." where id='$artikelid'");
 				$band = mysql_result($resultartikel,0,"band");
				$band = stripslashes ($band);
				$band3=urlencode($band);
				$titel = mysql_result($resultartikel,0,"titel");
				$titel = stripslashes ($titel);
				$autor = mysql_result($resultartikel,0,"autor");
				$autor = stripslashes ($autor);
				$datum = datum(mysql_result($resultartikel,0,"datum"));
				$review = mysql_result($resultartikel,0,"review");
				$review = stripslashes($review);
				$reviewgesamt = $review;
				$review=cuttext($review,150);
			$nummer=$i+1;
			print "<tr><td align=\"right\"><font size=\"2\"
face=\"Arial,Helvetica,sans-serif\">$nummer</font></td>";
			if ($band!=$titel || $bereich=="cdreviews") {
				// Bei manchen Bereichen gibt es keine Trennung zwischen Titel und
Band, so dass eine Spalte weggelassen werden muss
				// Da bei CD-Reviews aber manchmal sowohl Titel als auch Band
identisch sein koennen, muss diese Abfrage bei den CD-Reviews
ausgelassen werden
				print "<td><font size=\"2\" face=\"Arial,Helvetica,sans-serif\"><a
href=\"$server/suchen.php3?suchennach=$band3\" title=\"The Dark Portal
&ouml;ffnen und nach $band suchen\"
target=\"_top\">$band</a></font></td>";
			}
			print "<td><font size=\"2\" face=\"Arial,Helvetica,sans-serif\"><a
href=\"$server/$aufruf$artikelid\" title=\"$band - $titel
\n\n$review...\" target=\"_top\">$titel</a></font></td><td><font
size=\"2\"
face=\"Arial,Helvetica,sans-serif\">$datum</font></td><td><font
size=\"2\"
face=\"Arial,Helvetica,sans-serif\">$autor</font></td></tr>";
		$i++;
	}

	?>

	</table>
			</td>
		</tr>
	</table>
	</td>	</tr>
	</table><br>

	<?
  mysql_free_result($result);
  mysql_free_result($resultartikel);
}

---
*** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql 


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive