2009-11-19 11 views
0

Je veux chercher un ensemble de messages w/vote compte répertorié, classé par vote compte (par exemple)MYSQL rapporterait 10 messages, chaque chef d'accusation w/vote, Triés par vote, limité par la clause where sur les postes

Post 1 - Post Body blah blah - Votes: 500 
Post 2 - Post Body blah blah - Votes: 400 
Post 3 - Post Body blah blah - Votes: 300 
Post 4 - Post Body blah blah - Votes: 200 

J'ai 2 tables:

Messages - colonnes - id, body, is_hidden
Votes - colonnes - id, post_id, vote_type_id

Voici la requête que j'ai essayé:

SELECT p.*, v.yes_count 
FROM posts p 
LEFT JOIN 
    (SELECT post_id, vote_type_id, COUNT(1) AS yes_count 
    FROM votes 
    WHERE (vote_type_id = 1) 
    GROUP BY post_id 
    ORDER BY yes_count DESC 
    LIMIT 0, 10) v 
ON v.post_id = p.id 
WHERE (p.is_hidden = 0) 
ORDER BY yes_count DESC 
LIMIT 0, 10 

Justesse: La requête ci-dessus fonctionne presque. Le sous-ensemble inclut votes pour posts qui ont is_hidden = 1, donc quand je l'ai quitté le joindre à posts, si un post caché est dans le top 10 (classé par votes), je peux me retrouver avec des enregistrements avec NULL sur le champ yes_count.

Performance: J'ai ~ 50k messages et ~ 500k votes. Sur ma machine dev, la requête ci-dessus s'exécute en .4sec. Je voudrais rester à ou au-dessous de ce temps d'exécution.

Index: J'ai un index sur la table Votes qui couvre les domaines: vote_type_id et post_id

EXPLAIN

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY p ALL NULL NULL NULL NULL 45985 Using where; Using temporary; Using filesort 
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 10 
2 DERIVED votes ref VotingPost VotingPost 4  319881 Using where; Using index; Using temporary; Using filesort 

Répondre

0

Essayez

SELECT p.*, count(*) yes_count 
FROM posts p 
LEFT OUTER JOIN votes v ON (v.post_id = p.id and v.vote_type_id = 1) 
WHERE p.is_hidden = 0 
GROUP BY p.id 
ORDER BY yes_count DESC 
LIMIT 0,10 

Puisque c'est mysql , groupe par seulement p.id s fonctionnera (mais ce ne sera pas portable à d'autres dbs)

+0

cela est correct, mais il prend 1 seconde à exécuter. Je pense à stocker le nombre de votes dans chaque enregistrement de publication. – nibblebot

+0

essayez d'ajouter un index sur vote_type_id.post_id. Cela devrait l'accélérer. – DrewM

+0

ont déjà cet index, encore 1-1.1 sec exécuter – nibblebot