Performante DB-Abfrage

kesnw

Erfahrenes Mitglied
Hallo,

ich starte auf meiner MySQL-Datenbank folgende Abfrage:

PHP:
<?
include ("../verbindung/verbindung.php");
$verbindung = @mysql_connect("$host","$user","$passwort");
   if (!$verbindung) echo "Keine Verbindung zur Datenbank";
@mysql_select_db($datab,$verbindung) or die(mysql_error());

$query = "SELECT allgemein_5,sapnumber,L_ID,del,fragebogen,new,einschaetzung,kennzahlen, owner,zulassung, risiko from vendors ORDER BY allgemein_5 ASC";
$result = mysql_query($query, $verbindung) or die ("Error in query: $query. " . mysql_error());
while (list($allgemein_5, $sapnumber, $L_ID, $del, $fragebogen, $new, $einschaetzung, $kennzahlen, $owner, $zulassung, $risiko) = mysql_fetch_row($result)) 
  {
?>
                    <tr>
                      <td WIDTH = "250" VALIGN="top">
                        <?
                          echo $allgemein_5;
                        ?>
                      </td>
                      <td width="20">
                      </td>
                      <td WIDTH = "60" VALIGN="top">
                        <?
                          echo $sapnumber;
                        ?>
                      </td>

u.s.w.

Es dauert EWIG bis sich die Seite aufbaut. Hat jemand eine Idee, wie man die Abfrage performanter gestalten kann? In der DB befinden sich etwa 1000 Datensätze...

Danke
 
Erzeuge einen Index für die Spalte allgemein_5 in der Tabelle vendors.
Ausserdem kannst Du mal die Zeit messen, die allein die Abfrage benötigt (ohne die HTML-Ausgabe).

snuu
 
Ist das mit dem list() nicht ein wenig viel Aufwand und extrem ressourcenlastig ?!
Ich würds ja einfacher machen $row = mysql_fetch_*array*assoc*row*object*() ...
 
Ein Index hilft MySQL dabei schneller auf die Werte einer Spalte zuzugreifen. Würdest Du zum Beispiel die Datenmenge über where spalte = 'Wert' einschränken, so müsste MySQL ohne dem Index auf der Spalte alle Datensätze durchlaufen, um die richtigen Datensätze zu finden. Mit Index geht der Suchvorgang bedeutend schneller.

Da Du ohnehin alle Datensätze aus der Tabelle holst, ist dieses Beispiel hinfällig. Allerdings sortierst Du dir Datensätze, wobei ich nicht genau weiß, ob Dir der Index dabei weiter hilft - aber ich vermute es :) .

Die Zeit kannst Du wiefolgt messen:
PHP:
$t = time(); // Startzeit
$query = "SELECT allgemein_5,sapnumber,L_ID,del,fragebogen,new,einschaetzung,kennzahlen, owner,zulassung, risiko from vendors ORDER BY allgemein_5 ASC"; 
$result = mysql_query($query, $verbindung) or die ("Error in query: $query. " . mysql_error());
echo time()-$t; // Zeitdiffernz in Sekunden
 
Für die Select-Anweisung gibt er "0" aus.
Die while-Schleife durchläuft er in "38". Was bedeutet das nun?

Wie genau ist denn die andere Variante ohne list() zu programmieren.
Hab das mal folgendermassen versucht, jedoch wurden etliche Zeilen weggelassen...

PHP:
$query = "SELECT allgemein_5,sapnumber,L_ID,del,fragebogen,new,einschaetzung,kennzahlen, owner,zulassung, risiko from vendors ORDER BY allgemein_5 ASC";
$ausgabe = mysql_query($query);
if (mysql_numrows($ausgabe))
{
while ($zeile = mysql_fetch_row($ausgabe))
{
echo $zeile[allgemein_5];
echo $zeile[sapnumber];
echo $zeile[L_ID];
}
}

Warum werden hier Zeilen "verschluckt"?
 
Wie wärs denn mal mit Seitenblättern (Stichwort LIMIT)?
Wenn du wirklich 1000 Datensätze auf einer Seite anzeigen willst ist das nunmal lahm...
 
Ja, aber ich muss suchen können und ich denke es ist recht umständlich eine Suchfunktion zu implemetieren oder wie seht ihr das?

Hat jemand einen Codeausschnitt?

Hinweis wie man das am einfachsten macht?
 
Wie es schon weiter oben gesagt wurde: Du kannst das Ergebnis mit WHERE einschränken und so auch suchen. WHERE name='hans' ... Die Doku auf http://www.mysql.com ist dein Freund!
 
Ersetze Deine While-Schleife durch folgendes:
PHP:
while ($row = mysql_fetch_array($result)) {
und greife auf die einzelnen Spalten über
PHP:
 $row['allgemein_5']
(usw.) zu
 
Zurück