O MySQL e o PHP desempenho de várias consultas
-
22-12-2019 - |
Pergunta
Eu estou pedindo a você alguns conselhos.Eu tenho um site onde eu tenho vídeos e os usuários podem dar-lhes os polegares para cima e o polegar para baixo.Sua guardado em uma única tabela.Atualmente tenho três consultas sql para obter a contagem de polegar para cima, a contagem dos polegares para baixo e que o usuário conectado deu (se ele tiver).
E agora eu estou pensando sobre fazer o que mais o desempenho, mas eu não sei o que é melhor, pois quero manter a contagem de consultas para baixo.
Método 1) Manter estes três consultas como eles são:
SELECT COUNT(*) as rowcount FROM `videolikes` WHERE `vid` = 'gt6w_RZfs5yx' AND `thumb` = '1' LIMIT 1
SELECT COUNT(*) as rowcount FROM `videolikes` WHERE `vid` = 'gt6w_RZfs5yx' AND `thumb` = '0' LIMIT 1
SELECT * FROM `videolikes` WHERE `vid` = 'gt6w_RZfs5yx' AND `uid` = '1' LIMIT 1
Método 2) Fazer uma consulta com o sub-consultas (algo parecido (não funciona como é aqui)):
SELECT *, (SELECT COUNT(*) as rowcount FROM `videolikes` WHERE `vid` = 'gt6w_RZfs5yx' AND `thumb` = '1' LIMIT 1) as thumbsups, (SELECT COUNT(*) as rowcount FROM `videolikes` WHERE `vid` = 'gt6w_RZfs5yx' AND `thumb` = '0' LIMIT 1) as thumbsdowns FROM `videolikes` WHERE `vid` = 'gt6w_RZfs5yx' AND (`uid` = '1' OR `uid` = NULL)
Método 3) a Sua própria idéia, talvez?
Me diga o que você pensa e dar algum código (se você quiser).
Melhores Cumprimentos Charlotte
editar:Eu vou adicionar mais algumas informações:vid é o id do vídeo.Tudo sobre o que gosta é armazenado nesta tabela, referenciados para o vídeo com o Bk (vid).uid é o id de usuário que deu a gostar (ou não gostar).Isso significa que não há apenas o que gosta e o que não gosta de um vídeo para esta tabela.Para saber o que gosta e não gosta que, por vídeo, como será armazenado com o bk.
Solução
Ou você pode usar uma única consulta para cima/para baixo votos:
SELECT SUM(thumb = 1) AS upvote, SUM(thumb = 0) AS downvote, ....
O MySQL irá tomar as boolean true/false resultados dessas thumb = X
testes, converter para inteiro 0
ou 1
, e , em seguida, soma-las
Outras dicas
Você pode combinar as duas primeiras consultas como:
SELECT
SUM(IF(`thumb` = 1, 1, 0)) AS rowcountthumb0,
SUM(IF(`thumb` = 0, 1, 0)) AS rowcountthumb1
FROM `videolikes` WHERE `vid` = 'gt6w_RZfs5yx'
Desde a última consulta parece ser semanticamente diferentes, gostaria de mantê-lo separado do referido aqui para maior clareza.