Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

junção interna selecione (A, B) em A e B vs onde (A, B) em select (A, B) no mysql


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.