DB-Abfrage mit Schleife schneller bei $data['ID']=$id?

Jakob

Jakob

Aktives Mitglied
Thread Starter
Dabei seit
05.01.2004
Beiträge
1.070
Reaktionspunkte
21
Hallo,

wenn ich in einer Schleife aus einer DB etwas auslese und bei jedem Schleifendurchgang mehrfach auf eine Zelle zugreifen muss, bringt es einen Geschwindigkeitsvorteil, wenn ich die Zelle als Variable definiere?

also statt
PHP:
while($data = $produkte->fetchRow())
{
  $data['ID'];
  // […]
  $data['ID'].$data['ID'].$data['ID'];
}

das:
PHP:
while($data = $produkte->fetchRow())
{
  $data['ID'] = $id;
  $id;
  // […]
  $id.$id.$id;
}

Ich weiß, ich könnte es messen, aber vll. weiß es ja schon jemand, oder ihr bezeichnet das gleich von vornerein als Schwachsinn :)
 
Ich würd sagen:

Es bringt keinen Vorteil, eher einen Nachteil, da noch ein Zwischenschritt eingebaut wird.
Er greift mit $date['feld'] ja nicht auf die Datenbank zu, sondern auf die bereits gespeicherten Daten. Ob die jetzt ein einer Variablen oder in einem Array liegen, das sollte keinen Unterschied machen.

Also->

Da kein Datenbankzugriff besteht, ist die Frage, ob Variablen oder Arrays schneller sind. Und das ist, salopp gesagt, scheißegal :)

gruß
Lukas
 
Arrays erstellen/verändern in PHP ist ( da assoziativ ausgelegt) langsamer. Definitiv kann ich das für PHP4 sagen, ob das in PHP5 besser wurde habe ich bisher nicht geprüft. Merken tut man das aber erst ab einigen 1000den Elementen!

Der Zugriff auf bestimmte Einträge in Array ist jedoch ( eben wegen der assoziativen Arrays) sehr schnell. Das kann man seelenruhig tun! Genau dafür ist diese Art von Arrays gewählt worden. Ich selbst speichere solche Resultset immer in Arrays von Objekten (Produkte, Kunden,Rechnungen,...)
 
Vielen Dank, besonders für die Assoz-Erklärung von Dir, wegus. Heißt das, der Zugriff per $data['ID'] ist genauso schnell wie $data[0]?

PHP baut alle Arrays als Hashes auf, somit ist sowohl die 0 als auch die ID nichts weiter als ein Key für den Hash! Es sollte also gleichschnell sein.
Die andere Implementierung sind dann echte Speicherblöcke (malloc in C), bei denen dann für ein Array mit 1000 Elementen auch wirklich 1000x Speicherplatz reserviert wird. Bei PHP führt ein singuläres $data[1000]=12 zu exakt nur einer Belegung. Daher braucht man auch den foreach iterator, weil man auf eine geschlossene key-Folge nicht wirklich bauen kann. Was ich hier schreibe beschreibt aber im Wesentlichen PHP4, da ich zur Zeit auf ein Java-basiertes Intranet setzen muß, bin ich bei PHP nicht mehr auf dem aktuellen Stand. Man möge mich daher bitte unbedingt korrigieren.
 
Zuletzt bearbeitet von einem Moderator:
für PHP4 ist 0 genauso ein Hash-Key wie 'ID', beides ist das Gleiche. Ob das bei PHP5 noch exakt gleich gehandelt wird weiß ich nicht, weil ich beruflich zur Zeit nach Java wechseln muß und nur noch sporadisch PHP mache.

Gegenstück zum Hashing sind dann Speicherblöcke die für Array allociert werden, etwa wie in C. Ein Array mit 1000 Elementen verbaraucht dabei auch leer gleich den vollen Speicherplatz. Bei PHP wir nur für belegte Keys auch ein Element gespeichert. Daher braucht man auch den foreach-Operator. Eine Key-Folge muß nämlich nicht kontinuierlich sein. Der Zugriff auf Hashschlüssel ist dadurch sehr schnell, der Speicherverbrauch optimal - nur die Änderung der Struktur dauert eben länger, weswegen Arrayoperationen immer teuer sind.
 
Zurück
Oben Unten