Ein SQL-Statement oder mehrere? Performance?

SELLOSO

Grünschnabel
Hallo Leute,

ich habe ein spezielles Problem, aber vielleicht könnt Ihr mir helfen oder mich an andere verweisen.

Ich bin momentan dabei, eine CD-Datenbank-Anwendung mit PHP und MySQl umzusetzen. Dabei programmiere ich objektorientiert, d.h. ich verwalte die Eigenschaften einer CD in Klassen. Als Beispiel nehme ich mal die Eigenschaft "Interpret".

Für diese habe ich eine eigene Tabelle (artists) angelegt und kann nun einen einzelnen Datensatz wunderbar mit der Klasse bearbeiten (neuen einfügen, bearbeiten, löschen, ausgeben). Ich erzeuge ein Objekt und übergebe mittels Konstruktor die ID eines Datensatzes und als zweiten Parameter einen boolschen Wert: True: Es soll ein neuer Datensatz mit der übergebenen ID angegeben werden / False: Der Datensatz mit der übergebenen ID existiert bereits.

Nun habe ich eine Funktion innerhalb der Klasse geschrieben, die aus der Tabelle "artists" alle IDs ausliest und einen Array mit den IDs zurück gibt. Mit einer foreach-Schleife arbeite ich nun dieses Array ab, erstelle jedesmal ein Objekt und gebe die Daten aus dem Datensatz aus.

ich frage mich nun aber, ob es von der Performance her nicht zu langsam läuft. Es dürfte doch viel weniger Resourcen brauchen, wenn einfach ein Statement ausführte und dann mit ner mysql_fetch_array und einer while-Schleife das Ding ausgeben würde, oder nicht? Anerderseits will ich so viel wie möglich auf diese Klassen bauen!

Was denkt Ihr dazu und wie würdet Ihr es lösen?

Ich wäre Euch für eine Antwort sehr dankbar!

Ciao
Selloso
 
Hallo!

Ich habe für die Datenbankenabfragen, die ich brauche, auch in Klassen programmiert.
Ich habe z. B. eine Klasse class.angebote.php, in der nur die ID's aller Angebote gesucht werden. Diese werden dann in einem Array gespeichert und an die Klasse class.angebot.php übergeben. Dort kann ich dann den einzelnen Datensatz einfügen, bearbeiten oder löschen, den ich anhand der ID haben will.
Ich habe keine Probleme mit der Performance. Außerdem denke ich, dass es von der Handhabung und dem Zugriff auf die Daten wesentlich einfacher ist!

redlama
 
Hi
Ich denke du kannst dir die Perfomenc auch einsparen, in dem du die Klasse so programmierst, dass sie sich selbst abrufen kann.
if(!isset($this->bla)){ $this->bla(); }

Solche codes kannst du innerhalb einer Funktion einer Klasse anwenden, und dann kannst du damit erzwingen

Falls Datensatz id bla existiert – Verarbeitung
Ansonsten – Hol Datensatz id bla - Verarbeitung
 
In der Regel sind weniger SQL-Statements deutlich schneller. Das kann ich aus meiner Erfahrung mit einem 350-Mhz-Testserver eindeutig sagen.
Um objektorientiert zu bleiben, könntest Du Dir eine Klasse CDListe oder nach Gamma et. al. (Designpatterns) eine Abwandlung einer Fabrik oder eine Kombination aus Direktor und Erbauer implementieren.
Diese Klasse liest die gesamte Liste aus der Datenbank und erzeugt mit den Daten die CDs.
Den Konstruktor der CD-Klasse könntest Du dann z.B. so anpassen:
PHP:
function CD ($id,$getFromDB=true,$CDTitel=null /* usw. */) {
    $this->id = $id;
    if ($getFromDB) {
        $this->getFromDB();
    } else {
        $this->CDTitel = $CDTitel;
        //usw.
    }
}
Ich denke damit ist die Kapselung nicht so weit durchbrochen, als dass Du sie nicht mit der Performance rechtfertigen könntest.

Gruß hpvw

PS: Bei oben genanntem Server und ca. 300 Datensätzen hatte ich Zeitgewinne von bis zu 20 Sekunden und das obwohl das einzelne Query (1 einzelnes Query) mehrere JOINS enthielt und die Trennung in ID-Sammlung und Schleife (4 einzelne Querys + 300 in der Schleife) nicht.
 
Zurück