Può essere sinistro join essere ottimizzato in query mysql degli utenti preferite?
-
13-11-2019 - |
Domanda
Ho due tavoli:
poll_response (poll_id, option_id, user_id) (circa 500.000 righe, con 500 sondaggi unici, 1000 opzioni uniche e 25000 utenti unici)
Preferred_USer (user_id) (circa 800 righe)
Vorrei determinare quale percentuale degli utenti che selezionano ogni opzione sono "utenti preferiti" (cioè quelli con alta reputazione).Altri utenti possono rispondere al sondaggio;Per identificare che la risposta proviene da un utente preferito, il join è necessario per la tabella Preferred_USer.
Ecco cosa ho:
.
SELECT option_id, count(*) AS all_votes, count(preferred_users.user_id) AS preferred_votes
FROM response
LEFT JOIN preferred_users ON response.user_id = preferred_users.user_id
GROUP BY option_id
La query sputa una tabella come questa:
.
| option_id | all_votes | preferred_votes
| 1 | 500 | 150
| 2 | 550 | 250
| 3 | 525 | 300
Posso quindi fare la matematica per determinare la percentuale.
Il problema è che la query spesso è scaduta - il che significa che ci vuole ben oltre un minuto da completare.
C'è un modo per sbarazzarsi del join sinistro o altrimenti ottimizzare la query?
Soluzione
Hai provato a dividerlo in due query - una per il totale e uno per gli utenti preferiti?Sospetto che ciò che lo stia facendo funzionare lentamente è in esecuzione attraverso le voci nel gruppo contando le voci non nullo (ma potresti vederti usando Spiega).
In altre parole:
select option_id, count(*) from response group by option_id
select option_id, count(*) from response, preferred_users where response.user_id = preferred_user.id group by option_id
.
Potresti anche unirti a loro:
select * from
(select option_id, count(*) as total from response group by option_id
left join
select option_id, count(*) as preferred from response, preferred_users where response.user_id = preferred_user.id group by option_id
using (option_id))
.
(Non sono sicuro se ho la sintassi proprio lì, ma hai l'idea).
Inoltre, hai un indice sulla colonna Preferred_Users.ID anche, giusto?e una relazione chiave straniera da uno all'altro?In caso contrario, prova con questo primo.