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
cela est correct, mais il prend 1 seconde à exécuter. Je pense à stocker le nombre de votes dans chaque enregistrement de publication. – nibblebot
essayez d'ajouter un index sur vote_type_id.post_id. Cela devrait l'accélérer. – DrewM
ont déjà cet index, encore 1-1.1 sec exécuter – nibblebot