estoy usando esta consulta para obtener todos los empleados de {clientes con el nombre que empieza con "a" minúscula}:MySQL - cómo utilizar índice en donde x IN (<subquery>)
SELECT * FROM employees
WHERE client_id IN (SELECT id FROM clients WHERE name LIKE 'a%')
Columna employees.client_id
es una int, con INDEX client_id (index_id)
. La subconsulta debe en mi humilde opinión devolver una lista de id-s, que luego se utiliza en la cláusula WHERE.
Cuando consulta EXPLAIN
, la consulta principal no utiliza índices (type:ALL
). Pero cuando yo EXPLAIN
una lista tomada de la subconsulta (por ejemplo, SELECT ... WHERE client_id IN (121,184,501)
), el EXPLAIN
cambia a type:range
, y esta consulta se vuelve más rápida en un 50%.
¿Cómo puedo hacer que la consulta utilice el índice para los datos devueltos por subconsulta, o existe una forma más eficiente de recuperar estos datos? (Recuperar la id-list para el servidor de aplicaciones, unirla y enviar una segunda consulta es aún más costoso aquí).
Gracias de antemano.
También podría usar la sintaxis INNER JOIN. – MarkR
He visto casos en los que el optimizador de consultas lo hace realmente incorrecto, y una subconsulta para devolver identificadores se cargó más rápido. Pero fue un caso realmente específico. Ver: http://www.benlumley.co.uk/2008/06/25/mysql-query-optimiser-left-lacking/ si está interesado en detalles. – benlumley