Rendimiento de MySQL – Cláusula “IN” contra Iguales (=) para un valor único

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

Tengo una statement 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 del count($object_ids) de comprobación count($object_ids) lo que se guardará en la statement sql real (si corresponde)?

Ninguno de ellos realmente importa en el gran scope 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 perfilar y probar la carga de su aplicación para saber dónde están los cuellos de botella reales.

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 :

Explicar para una consulta con <code/> = 1 </ code>“> </p>
<hr />
<p>  <code>EXPLAIN</code> para una consulta con <code>IN(1)</code> : </p>
<p> <img src=

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

Ejecute las dos consultas con una statement de explicación. Esto le mostrará lo que MySQL está haciendo. Usted se centra en la optimización de MySQL debe estar en lo que está haciendo MySQL con la consulta internamente. 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 statement EXPLAIN de MySQL es oro aquí. Por lo tanto, cuando llegue a una consulta que se está ejecutando lentamente, la instrucción EXPLAIN le mostrará por qué.

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)

Ejecuto la consulta con la statement de explicación y aquí están los resultados enter image description here

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