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