2012-07-23 19 views
5

Estoy buscando acelerar algunas consultas utilizando declaraciones preparadas en un sitio con mucho tráfico. Lo que no creo que entiendo correctamente es el beneficio de usar declaraciones preparadas a menos que puedan mantenerse preparadas a través de múltiples conexiones. parece que esto no es posible con PDO, que tampoco permite conexiones persistentes. pero las funciones de conexión persistentes no permiten PDO.mysql declaraciones preparadas permanentemente

digamos que para el bien de los argumentos estoy funcionando una consulta 5.000 veces por segundo: SELECT * FROM some_table DONDE some_column COMO 'some_value'

Por lo que entiendo, DOP impediría MySQL desde re-compilación y evaluación de la consulta si tuviera que cambiar "some_value" cada vez que necesitaba consultar. También entiendo que "some_value" podría transmitirse en binario en lugar de ASCII para ahorrar ancho de banda, pero no ahorraría mucho si tuviera que enviar toda la consulta cada vez que abro la conexión.

también por lo que he leído, los procedimientos almacenados no son la solución, porque tampoco se compilan a través de múltiples conexiones.

¿hay alguna solución a este problema? ¿almacenar una declaración preparada en el servidor en alguna parte y mantenerla compilada en memoria y lista para disparar tan pronto como reciba las variables?

¿Hay alguna manera de que esto suceda al combinar la agrupación de conexiones con PDO? (Aunque también he escuchado que la agrupación de conexiones no es ideal porque puede causar bloqueo en ciertas condiciones)

+0

Si desea utilizar conexiones persistentes, debe establecer PDO :: ATTR_PERSISTENT en la gama de las opciones del controlador pasa al constructor de PDO . Si establece este atributo con PDO :: setAttribute() después de la instanciación del objeto, el controlador no usará las conexiones persistentes. –

+1

¿Por qué no utilizar Memcached? –

Respuesta

0

No es probable que el uso de declaraciones preparadas con MySQL haga sus consultas mucho más rápido, y evita que la caché de consultas también funcione. Necesita algo de almacenamiento en caché en frente de su base de datos si realmente necesita ejecutar la misma consulta 5k/s. Memcached es popular, como lo es Redis. Dependiendo de lo que esté haciendo, los elementos de almacenamiento en caché o toda la página también pueden ser una opción.

+2

Esto no es cierto, la mayoría de las declaraciones preparadas ** están ** en la memoria caché. Ver http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html –

+0

Ah, este es un nuevo comportamiento en 5.1.17, gracias. –

5

Después de ejecutar numerosos puntos de referencia, encontramos que las declaraciones preparadas preparadas en el servidor nos proporcionaron los mayores beneficios de velocidad. Aquí hay un ejemplo:

DROP PROCEDURE IF EXISTS get_user; 

DELIMITER // 

CREATE PROCEDURE get_user(IN v_user VARCHAR(255)) 
DETERMINISTIC 
READS SQL DATA 
SQL SECURITY INVOKER 
COMMENT '' 
proc: BEGIN 
    SET @user = v_user; 

    IF ISNULL(@get_user_prepared) THEN 
     SET @get_user_prepared = TRUE; 

     SET @sql = "SELECT * FROM mysql.user WHERE user = ?"; 

     PREPARE get_user_stmt FROM @sql; 
    END IF; 

    EXECUTE get_user_stmt USING @user; 
END; 
// 

DELIMITER ; 
+0

Cada declaración preparada nativa está siendo preparada en el servidor. Sin embargo, no los hace persistentes entre las conexiones. –

0

No, no hay forma de utilizar declaraciones preparadas persistentes.

Sin embargo, no es una solución ideal para la consulta que se ejecuta 5.000 veces por segundo - Handlersocket

Cuestiones relacionadas