sql >> Base de Datos >  >> RDS >> Mysql

MySQL PDO preparado más rápido que la consulta? Eso es lo que muestra esta sencilla prueba.

Hay una pequeña cosa para mencionar. Por defecto, PDO simplemente emular declaraciones preparadas.
Y mientras está en modo de emulación, ejecuta la misma consulta anterior sin preparar una sola declaración :)

Entonces, en primer lugar,

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

para activar declaraciones preparadas reales.

Hay otra cosita que mencionar.
Lamentablemente, hay muy pocas reales conocimiento en el mundo. Y especialmente en el mundo de los sitios de preguntas y respuestas. Las personas tienden a repetir la información que leyeron y encontraron razonable. Sin ejecutar ninguna prueba para probar o incluso sin poner sus manos sobre. Por lo tanto, "anotado a menudo" no debe considerarse una fuente confiable en absoluto.

Volviendo al asunto:aunque debería haber alguna sanción, debería ser insignificante la mayor parte del tiempo. Si es así, debe ajustar su sistema.

De todos modos, en el modo de emulación lo tienes "rápido" y seguro.

Actualizar
Bueno, después de ejecutar sus pruebas en mis datos, debo decir que hay algo mal con su base de datos si tiene una diferencia de 3 veces en un conjunto de datos grande.

Para una consulta relámpago

select title from Board where id = 1

los resultados son

emulation   on      off
query      0.07    0.130
prepare    0.075   0.145

mientras que para la consulta bastante onerosa

select title from Board where id > 1

los resultados son

emulation   on      off
query      0.96    0.96
prepare    0.96    1.00

Entonces, como podemos ver, en un gran conjunto de datos, la diferencia se vuelve imperceptible.

Para la consulta relámpago hay alguna diferencia, pero, como solo se necesita la fracción 0,0003 de segundo (para una sola consulta), diría que es un ejemplo perfecto para la palabra "indiferencia".

Para obtener los mismos resultados entre query()/prepare(), solo tengo una idea:PDO usa preparar/ejecutar para todas las consultas, incluso aquellas sin enlaces.

Ahora al problema de la codificación.

Sí, el extraño problema de GBK afecta a PDO para versiones anteriores a 5.3.3. Estas versiones no tenían forma de establecer la codificación adecuada y eran inevitablemente vulnerables (en modo de emulación). Pero desde 5.3.3, PDO admite la configuración de codificación en DSN, y ahora todo está bien.
Para mysqli, uno tiene que usar mysqli_set_charset() para este mismo propósito con el mismo resultado (impenetrable).

En mi propia clase que se basa en mysqli, estoy usando mi propia implementación de marcador de posición y no uso ninguna declaración preparada. No por motivos de rendimiento, sino por una mayor fiabilidad.