Se eu aplicar dados estáticos na cláusula where, é mais rápido do que aplicar uma subconsulta. Exemplo:
(A consulta retorna 5 registros como conjunto de resultados)
SELECT STARTDATE, ENDDATE FROM TEST WHERE STARTDATE = '2012-08-21';
é mais rápido então:
SELECT STARTDATE, ENDDATE FROM TEST WHERE STARTDATE = (SELECT STARTDATE FROM TEST2 LIMIT 1);
ou eles são os mesmos em qualquer caso?
A subconsulta é executada sempre que uma comparação é realizada por consulta com cada registro ou apenas por 1 vez?
Antes do MySQL 5.6, a consulta interna é executada uma vez por entrada na linha externa e é fácil de provar:
Observe que a consulta leva 8 segundos, portanto, o SLEEP(1) é executado 8 vezes, uma vez para cada linha em
sample_data
.O MySQL 5.6 implementou a materialização de subconsulta que, em teoria, impedirá que isso aconteça em muitos casos. O MariaDB também possui um otimizador bastante aprimorado que deve evitar isso.
Na maioria dos casos, é preferível evitar subconsultas no MySQL.
Como Aaron postou, o otimizador do MySQL às vezes é estúpido. Se você não está trabalhando com as versões mais recentes do MariaDB (e mal pode esperar pelo lançamento do MySQL 5.6), ainda pode "enganar" o otimizador para executar a subconsulta uma vez, movendo-o
WHERE
daFROM
cláusula para: