MySQL PDO przygotowany szybciej niż zapytanie? To właśnie pokazuje ten prosty test

Oto prosty test, który przeprowadziłem, aby szybko zorientować się, jaką obniżkę wydajności zapłaciłbym za używanie przygotowanych instrukcji MySQL PDO w porównaniu z prostym zapytaniem. W tabeli osób znajduje się 2801 wierszy. MySQL wersja 5.5.28 i wersja PHP 5.3.15. Instalacje waniliowe, bez względu na domyślne parametry. Testy są uruchamiane na komputerze iMac z 8 GB.

$pdo = new PDO('mysql:host=localhost;dbname=cwadb_local', 'root', "");
$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
    $pdo->query("select * from person where name_last = 'smith' or true");
}
echo "<p>query: " . (microtime(true) - $start);

$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
    $stmt = $pdo->prepare("select * from person where name_last = :last or true");
    $stmt->execute(array('last' => 'smith'));
}
echo "<p>prepare/execute: " . (microtime(true) - $start);

i to było wyjście:

query: 21.010436058044

prepare/execute: 20.74036192894

Który nie wykazuje żadnej kary. Możliwości:

Buforowanie przygotowanego oświadczenia naprawdę działa. (Zauważ, że zachowałem funkcję przygotowania wewnątrz pętli.)

To fałszywy test, ponieważ jest zbyt prosty.

Nie ma żadnego teoretycznego powodu, dla którego przygotowanie / wykonanie powinno być wolniejsze, a zmęczeni ciągłymi krytycyzmami, programiści MySQL / PDO / PHP ciężko pracowali nad ich szybszym działaniem, próbując nas wszystkich zamknąć.

Inny?

Wielokrotnie mówiono tutaj, że używanie przygotowanych instrukcji jest bezpieczniejsze niż użycie zapytania, a przy nazwanych parametrach w PDO (Mysqli ich nie ma), radzenie sobie z parametrami jest całkiem wygodne. Ale tak samo często zauważa się, że istnieje kara za wykonanie, jeśli oświadczenie musi być przygotowane za każdym razem, gdy jest wykonywane.

Czy ktoś może dostarczyć testy, które przeczą mojemu prostemu testowi? Czy też powinniśmy teraz przyznać, że nie ma powodu, aby nie używać przygotowanych oświadczeń?

questionAnswers(2)

yourAnswerToTheQuestion