Performance Simples De Subquery MySQL

considere as 2 perguntas MySQL:

SELECT ue.userid,e.courseid 
FROM (SELECT id,courseid FROM mdl_enrol WHERE status = 0 AND courseid IN (46)) e 
INNER JOIN (SELECT enrolid,userid FROM mdl_user_enrolments ) ue ON ue.enrolid = e.id 
INNER JOIN (SELECT userid FROM mdl_userdata) ud ON ue.userid = ud.userid

--

SELECT ue.userid,e.courseid 
FROM mdl_enrol e 
INNER JOIN mdl_user_enrolments ue ON ue.enrolid = e.id 
INNER JOIN mdl_userdata ud ON ue.userid = ud.userid
WHERE e.status = 0 AND e.courseid IN (46)

a consulta de baixo é muito mais rápida do que a de cima, mas porquê? Eu li que para aumentar o desempenho você só deve selecionar as colunas que você precisa. Além disso, para mim a consulta de topo deve ter um melhor desempenho porque em cada adesão, você está reduzindo a quantidade de dados que você está se juntando. Obviamente, a minha compreensão de como as bases de dados funcionam está errada, mas se alguém pudesse esclarecer isto, seria muito apreciado. Uma explicação também confirma que a consulta inferior é muito mais rápida.

Muito obrigado.

Author: paul78, 2012-09-11

1 answers

Na primeira consulta, o mysql deverá seleccionar um subconjunto de mdl_enrol tabela e Completo mdl_user_enrolments e mdl_userdata na memória. Então você seleciona um monte de dados na memória. Depois de fazeres isso, junta - te aos dados. Se não houver memória suficiente para colocar todos os dados até que ele é juntado e enviado de volta para o cliente - então mesa temporária no disco rígido é criado. O mais provável é que o Optimizador mysql não seja fixe o suficiente para corrigir o seu erro e tentar melhorar o plano de execução. É por isso que é lento.

Considerando que para a segunda consulta mysql sabe exatamente o que precisa para selecionar e só seleciona a pequena quantidade de dados necessários. Neste cenário é possível usar índices (assumindo que todos os índices necessários foram criados). Então é rápido.

 2
Author: zerkms, 2012-09-11 08:46:07