Translate: 
EnglishFrenchGermanItalianPolishPortugueseRussianSpanish

Prepared statements nie takie szybkie jak myślisz…

Logo MySQLOkazuje się jednak że prepared statements oprócz swoich oczywistych zalet w postaci ochrony przed SQL injection oraz odciążaniu bazy danych od ciągłego parsowania zapytań, posiadają też jedną „drobną” wadę.

W przypadku bazy danych MySQL bywają mniej wydajne dla zapytań typu SELECT.

Dlaczego?

Problemem w tym przypadku okazuje się brak cache’owania zapytań, gdy korzysta się mechanizmu QUERY CACHE wbudowanego w bazę danych.

Zapytanie typu:

SELECT SQL_CACHE * FROM mysql.USER WHERE USER='root';

Zostanie scache’owane, podczas gdy:

SELECT SQL_CACHE * FROM mysql.USER WHERE USER=:bind_user;

Już nie…

W większości przypadków różnica w wydajności jest na szczęście niezauważalna, lecz dla chcących wycisnąć maksymalną wydajność z bazy danych może być dobrą ciekawostką.

Rozwiązanie

Najlepszym rozwiązaniem jest w takim przypadku… włączenie emulacji prepared statements po stronie biblioteki PDO:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

Twórcy PHP najwyraźniej zdają sobie sprawę z tego problemu od dawna, wnioskować można jednak, że błąd leży w bibliotece klienckiej dostarczonej przez Oracla, lub w samym serwerze MySQL.

Tagi: ,

Dodaj odpowiedź