query queries optimize how high best accelerate php mysql performance

php - queries - Rendimiento de MySQL: cláusula "IN" vs. igual(=) para un valor único



mysql views performance (6)

Ejecutar las dos consultas con una declaración de explicación. Esto le mostrará lo que MySQL está haciendo. El enfoque en la optimización de MySQL debe estar en lo que hace MySQL con la consulta interna. Tratar de optimizar qué consulta se ejecuta es un poco prematuro.

Ambas consultas podrían tener un rendimiento terrible si no hay un índice, por ejemplo. La declaración EXPLAIN de MySQL es oro aquí. Entonces, cuando llegue a una consulta que se está ejecutando lentamente, la instrucción EXPLAIN le mostrará por qué.

Esta pregunta ya tiene una respuesta aquí:

Esta es una pregunta bastante simple y supongo que la respuesta es "No importa", pero tengo que preguntar de todos modos ...

Tengo una declaración sql genérica construida en PHP:

$sql = ''SELECT * FROM `users` WHERE `id` IN('' . implode('', '', $object_ids) . '')'';

Suponiendo verificaciones de validez previas ( $object_ids es una matriz con al menos 1 elemento y todos los valores numéricos), ¿debería hacer lo siguiente en su lugar?

if(count($object_ids) == 1) { $sql = ''SELECT * FROM `users` WHERE `id` = '' . array_shift($object_ids); } else { $sql = ''SELECT * FROM `users` WHERE `id` IN('' . implode('', '', $object_ids) . '')''; }

¿O no vale la sobrecarga de la count($object_ids) de cheques count($object_ids) lo que se guardará en la declaración sql real (si corresponde)?


Ejecuto la consulta con la explicación de explicación y aquí están los resultados

Es obvio que el operador "Igual" es mejor, escanea 13 filas y "IN" escanea todas las filas


Imagino que internamente mysql tratará la consulta IN (6) exactamente como una consulta = 6 por lo que no hay necesidad de molestar (esto se llama optimización prematura por cierto)


La mayoría de las otras respuestas no proporcionan nada concluyente, solo especulación. Entonces, basado en el buen consejo de la respuesta de @Namphibian , ejecuté una EXPLAIN en algunas consultas similares a las del OP.

Los resultados están a continuación:

EXPLAIN para una consulta con = 1 :

EXPLAIN para una consulta con IN(1) :

EXPLAIN para una consulta con IN(1,2,3) :

Como puede ver, MySQL optimiza IN(1) para ser el mismo que = 1 en este tipo de consulta. Sin embargo, la respuesta de @ mes parece indicar que esto podría no ser siempre el caso con consultas más complejas.

Entonces, para aquellos que eran demasiado perezosos para ejecutar el EXPLAIN ellos mismos, ahora lo saben. Y sí, es posible que desee ejecutar EXPLAIN en su propia consulta para asegurarse de que se maneje de esta manera. :-)


Ninguno de ellos realmente importa en el gran alcance de las cosas. La latencia de la red en la comunicación con la base de datos superará con creces la sobrecarga del count($object_ids) o la sobrecarga de vs vs. Yo llamaría a esto un caso de optimización prematura.

Debe realizar un perfil y una prueba de carga de su aplicación para saber dónde están los verdaderos cuellos de botella.


No hay diferencia entre las declaraciones de MySQL, y el optimizador de MySQL transformará el IN en = cuando IN es solo un elemento. No te molestes