Isso não é muito fácil de responder a esta pergunta. Você deve saber uma coisa importante:MySQL trata
IN (<static values list>)
e IN (<subquery>)
como diferentes consultas
. O primeiro é igual a comparação de intervalo (como .. OR = .. OR =
) enquanto o segundo é igual a = ANY ()
- e não é o mesmo. Então, para resumir:usando IN
com subconsulta causará consulta com ANY()
e o MySQL não usará o índice para isso, mesmo que a subconsulta seja independente e retorne lista estática de valores . Triste mas verdadeiro. O MySQL não pode prever isso e, portanto, o índice não será usado, mesmo que seja óbvio. Se você usar JOIN
(ou seja, reescrever seu IN (<subquery>)
) - então o MySQL usará o índice para JOIN
condição, se for possível. Agora, o segundo caso pode ser sobre
JOIN
e IN
ao usar partições. Se você usar JOIN
- então, infelizmente - mas o MySQL também não é capaz de prever partições para JOIN
no caso comum - e usará todo o conjunto de partições para isso. Substituindo JOIN
para IN (<static list>)
mudará EXPLAIN PARTITION
picture:O MySQL usará apenas as partições necessárias para selecionar valores do intervalo, especificados em IN
cláusula. Mas, novamente, isso não funcionará com IN (<subquery>)
. Como conclusão - é triste, quando estamos falando sobre como o MySQL está lidando com
IN
subconsultas - e em casos comuns não podem ser substituídos por JOIN
com segurança (é sobre o caso de particionamento). Portanto, a solução comum será:separar a subconsulta da consulta principal no nível do aplicativo . Se estamos falando sobre subconsulta independente, retornando a lista de valores estáticos, essa é a melhor sugestão - então você pode substituir essa lista de valores por IN(<static list>)
e ganhe benefícios:o MySQL usará o índice para isso e, se estivermos falando sobre partições, apenas as realmente necessárias delas serão usadas.