Esse SELECT está correto? - MySQL - Fórum Script Brasil
Esse SELECT está correto?
Asked by aprendiz_ce,
Gostaria de saber se o SELECT logo abaixo está correto. O mesmo tem que me retornar os registros com datas dos últimos 5 (cinco) dias levando em conta a maior data encontrada entre todos os registros existentes.
SELECT ac.*, us.* FROM acessos ac
LEFT JOIN usuarios us ON ac.ace_login = us.usu_login
WHERE DATE(ac.ace_acesso) >= (SELECT DATE(date_sub(MAX(ace_acesso), INTERVAL 5 DAY)) FROM acessos)
ORDER BY ac.ace_acesso DESC
Estrutura reduzida da tabela acessos:
ace_date - date
ace_login - varchar(10)
Estrutura reduzida da tabela usuarios:
usu_login - varchar(10)
Fiz vários testes e aparentemente está funcionando corretamente, mas como não quero correr o risco de falhas na utilização do mesmo, conto com a ajuda de vocês para confirmar o resultado dos meus testes.
Dois pontos a observar:
1) remova a função DATE de DATE(ac.ace_acesso) ou esta query sempre rodará em TABLE SCAN.
2) crie um índice por ace_acesso na tabela acessos. Assim sempre você rodará esta query de forma agilizada.
Olá Denis, bom dia!
Só uma colocação: O campo/coluna "ac.ace_acesso" é do tipo datetime. Na hora de postar aqui, acabei errando essa informação, sendo assim, devo manter o DATE(ac.ace_acesso), Correto?
Fora esse possíveis ajustes, o meu SELECT está correto?
Muitíssimo obrigado pela sua valiosa atenção e fico no aguardo de seu comentário.
1) Só uma colocação: O campo/coluna "ac.ace_acesso" é do tipo datetime. Na hora de postar aqui, acabei errando essa informação, sendo assim, devo manter o DATE(ac.ace_acesso), Correto?
2) Fora esse possíveis ajustes, o meu SELECT está correto?
1) Sim.mas não vai usar índice. Sempre rodará em table scan. Se a tabela for grande o banco vai sentar.
Fico tranquilo em saber que a "formatação" desse SELECT está correto. A minha preocupação era somente essa mesma. Agora, sobre o índice eu já estava atento quanto a isso.
Se eu estiver utilizando índice para o campo/coluna "ace_acesso" e no momento de executar o SELECT eu utilizar DATE(ac.ace_acesso) o índice não terá mais efeito, é isso? Se sim, como resolvo isso, ou seja, manter um índice ATIVO para o uso do DATE(ac.acesso).?