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.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.