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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top