phpbar.de logo

Mailinglisten-Archive

[php] MySQL- Abfragen optimieren

[php] MySQL- Abfragen optimieren

Michael Stahmann michael_(at)_stahmann.de
Sat, 27 Jan 2001 15:06:58 +0100


Hallo Josef,

mein erster Kommentar heißt KREISCH

Vieleicht habe ich das Script völlig falsch interpretiert und etwas wesentliches übersehen, aber...


> Hi Leute.
> 
Hier der Code:
> 
> -----------------------
>      // Textareas und Überschriften generieren.
>      $sql = "SELECT id FROM contents WHERE page LIKE '$page_id' ORDER BY
> ID";

1. Vergleiche sollten möglichst mit = angestellt werden. Dazu macht man eine ID als INTEGER mit autoincrement. Die Referenz (Hier page) sollte ebenfalll eine Interger Zahl sein:
$sql = "SELECT id FROM contents WHERE page ='$page_id' ORDER BY ID

>      $result = send_sql($db, $sql);
>      while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
>        foreach ($row as $elem) {
>          $content_id = $elem;
>          $sql = "SELECT content FROM contents WHERE id LIKE '$content_id'";
>          $content_text = wert(send_sql($db, $sql));
>          $sql = "SELECT title FROM contents WHERE id LIKE '$content_id'";
>          $content_title = wert(send_sql($db, $sql));

Hier hast Du einen falschen Weg eingeschlagen, für jede Seite / jeden Titel werden 2 MySQL Abfragen gestartet. Das ist ersteinmal unperformant.. Hier solltest Du eine Abfrage machen und alles in ein Merhdimensionales Array einlesen. Für die LIKE-Anweisung gilt das gleiche wie oben.
Generell sollte es Möglich sein, alles mit einer JOIN-Abfrage in ein (1) Array zu lesen und es danach entsprechend auszugeben. Das ist wesentlich schneller, als so viele Abfragen.

Auf den Rest möchte ich gar nicht näher eingehen, da Dein Ansatz auch mit kleinen Änderungen nicht besser werden kann.

> Jedoch dauert die Ausgabe und die Speicherung der Daten sehr lange,
> vermutlich wg der vielen Server- Requests, auch wenn es meistens nur so um
> die 10 Inhalte immer ausgegeben werden.
> 
Wenn ich das richtig sehe, sind dafür 30 Abfragen notwendig...

> Kann man die Abragen optimieren, damit die Speicherung und das Anzeigen der
> Daten schneller geht?
> 
Als Lektüre empfehle ich Dir:
1. Paul Dubois - MySQL Etnwicklung, Implementierung und Referenz
2. http://ffm.junetz.de/members/reeg/DSP/ lesen, verstehen und anwenden...

Bitte verstehe mich nicht falsch, aber ich habe genauso angefangen und gleich beim ersten Projekt meine Fehler entdeckt. Nicht alles muß gleich perfekt sein und man muß sich nicht gleich mit einem JOIN o.ä. befassen, aber meine Devise ist mittlerweile, so wenige aber präsise DB-Abfragen wie Möglich. Alles in ein (Mehrdimensionales-)Array und dann ausgeben oder anderweitig weiterverarbeiten.
Das ist nicht immer allgemeingültig - aber für die meisten Fälle habe ich ganz andere Performance-Effekte festgestellt. Eine DB-Abfrage kostet ersteinmal mehr Zeit, als eine Rechenoperation in PHP.

Die mail soll nicht als Entmutigung sondern als Ansporn dienen, sich intensiv mit der Materie zu befassen. Da Du gerade ein Mini-CMS entwickelst, denke ich auch, das dies Dein Ziel ist.

Falls ich völlig daneben liege, verbessert mich bitte, damit ich meinen Irrweg einsehen kann :-)

Gruß Michael
-- 
--------------------------------------------------------
Michael Stahmann,      web-xact.de <website-development>
http://www.web-xact.de           mailto:info_(at)_web-xact.de
Burchardstr. 10, D-28217 Bremen, Tel/Fax 0421-3887750/51
--------------------------------------------------------



php::bar PHP Wiki   -   Listenarchive