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

Declaración de PDO que tarda 400 veces más que la CLI de MySQL

Sospecho que la lentitud está en obtener las filas, la cantidad de filas que se devuelven, en lugar de los más de 5000 marcadores de posición de enlace en la declaración. pId IN ( ? , ? , ... , ? )

Mi sugerencia sería probar la devolución de una sola fila, proporcionar un valor que se sabe que existe/devuelve una fila y luego más de 4999 valores que se sabe que no existen/no devuelven una fila.

Por ejemplo, si conocemos el valor de pId más alto en la tabla, use valores más altos que ese, proporcione valores de enlace para una declaración como esta

 ... pId IN ( ? , ? , ? , ... , ? )

por lo que el resultado sería equivalente a correr

 ... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )

que sería el mismo resultado que obtendríamos ejecutando

 ... pId IN ( 42 )

Nuestra expectativa sería devolver solo una fila ( pId =42 ).

Luego compare el tiempo de eso (más de 5000 valores de enlace que devuelven 1 fila) con dos valores de enlace que devuelven una sola fila

 ... pId IN ( 99999999 , 42 )

Y vea si hay una diferencia significativa en el rendimiento.

(Hay más trabajo por hacer con más de 5000 valores de vinculación, pero no esperaría una enorme diferencia, pero debe ser probado.

Pensándolo un poco, podría ser más fácil configurar una prueba usando todos los valores de vinculación existentes y simplemente agregando LIMIT 2 hasta el final de la consulta. (No estoy seguro de si MySQL tiene algunas mejoras de rendimiento para LIMIT 2 .

Quizás sea mejor agregar una condición como AND pId * 10 = 420

El objetivo es proporcionar una gran cantidad de valores de vinculación, pero solo devolver una o dos filas.

Otra prueba sería devolver una gran cantidad de filas, pero usando solo un par de valores de enlace. Tal vez una condición de rango que devuelva más de 5000 filas.

La consulta podría ser:

 ... pId >= ? AND pId <= ? 

con un rango lo suficientemente grande entre los valores provistos que obtenemos en el vecindario de 5000 filas.

Y compare el rendimiento.

Mi predicción (¿supongo?) es que el rendimiento se correlacionará más con la cantidad de filas devueltas que con la cantidad de valores de vinculación.

No estoy seguro de si esta es una respuesta a su pregunta, pero es el enfoque que tomaría para responder la pregunta... "¿Qué está causando que esto sea lento, la cantidad de valores de enlace o la cantidad de filas devueltas? "