Mailinglisten-Archive |
Steffen Kother wrote: > Hi ihr, > > Yannik Hampe wrote: >> Dann kommt noch dazu, dass pdo ein paar tolle Performancesteigerungen >> hat. Wie zum Beispiel foreach($statement as $row). Das ist zwar nur >> gerinfühgig schneller als die while-Lösung von mysql_fetch_*, >> aber wenn man sich nur genug Zeilen aus der DB holt fällt es schon ins > Gewicht. > > Wobei ich da ein Verständninsproblem habe. Wie müsste ich die Zeit für > einen korrekten Vergleich PDO vs. MySQL ermitteln? > > Variante A: > =========== > $pdoso = pdo -> query('SELECT * FROM something'); > $pdoso -> setFetchMode(PDO::FETCH_ASSOC);$query = mysql_query('SELECT * > FROM something'); > > for ($i = 0; $i < 10000; $i++) { > // PDO > foreach ($pdoso as $row) { > // Eine Zeile aus dem ganzen Ergebnis nehmen > } > > // MySQL > while($record = mysql_fetch_assoc(§query) { > // Ergebnis an der Resource abholen > } > } Die for-Shleife ist relativ sinnlos, denn der Query wird ausserhalb der for-Schleife einmal ausgeführt und dann rattern pdo und mysql einmal alle Zeilen durch und alle weiteren Schleifendurchläufe machen garnicht mehr, da beriets alle Zeilen geholt worden sin... > > Variante B: > =========== > for ($i = 0; $i < 10000; $i++) { > // PDO > foreach (pdo -> query('SELECT * FROM something') as $row) { > // Eine Zeile an der Resource abholen > } > > // MySQL unverändert > } Jetzt führst du PDO 10K mal aus aber mysql weiterhin nur einmal? > > Bei Variante A liegt PDO vor mysql_fetch_assoc() und PDOs fetchAll(). > Ich habe dazu einfach mal 10000 Loops über unseren Teilestamm (ca. 8500 > Sätze) gemacht und mir die Zeiten anzeigen lassen. Variante B ist > natürlich zu gunsten mysql_fetch_assoc() ausgefallen. Alles Andere hätte mich jetzt auch gewundert ;-). Um PDO und MySQL zu vergeleichen musst du dir erstmal überlegen, worum es dir geht. Wenn du wissen willst, wieviel schneller pdo's prepared statements im Vergleich zu mehrmals ausgeführten mysql_*-Statments sind müsstest du das so machen $start =microtime(true); $stmt =$pdo->prepare('SELECT * FROM tab WHERE rand=?'); for($i=0; $i<10000; ++$i) { $stmt->execute(array(mt_rand())); $stmt->setFetchMode(PDO::FETCH_NUM); foreach($stmt as $row) ... } echo 'PDO brauchte: ',microtime(true)-$start,' Sekunden'; $start =microtime(true); for($i=0; $i<10000; ++$i) { $result =mysql_query('SELECT * FROM tab WHERE rand='.mt_rand()); while($row =mysql_fetch_row($result)) ... } echo 'mysql_ brauchte: ',microtime(true)-$start,' Sekunden'; Das ganze kannst du natürlich scherzeshalber mit NUM und mit ASSOC mal machen. Das mt_rand() ist dafür da, damit der mysql-query-cache dein Ergebnis möglichst wenig verfälscht. Wenn du hingegen wissen möchtest, ob pdo oder mysql_ schneller ist, wenn du immer einen komplette anderen Query ausführst, dann musst du im pdo-Teil den prepare-Aufruf einfach noch mit in die for-Schleife legen. > > Ein schönes WE euch allen. Yannik
php::bar PHP Wiki - Listenarchive