2012-05-11 4 views
1

J'ai une table d'amis sur un réseau de type social Je construis avec cette structure:meilleure table « ami » MySql pour la performance

uid binary(16) 
memberid int 
friendid int 
datefriended datetime 
isactive bool 

De cette façon, j'ai des relations et d'autres données stockées dans une seule table. Mais dis-moi que j'ai besoin de tous mes amis, que je sois l'ami (membre) ou que je sois l'ami (ami), alors j'ai besoin d'obtenir les noms des utilisateurs de la table des membres. La requête est la suivante:

SELECT m.name FROM members m 
INNER JOIN friends f on m.memberid = f.friendid 
WHERE f.memberid = 1 

UNION ALL 

SELECT m.name from members m 
INNER JOIN friends f on m.memberid = f.memberid 
WHERE f.friendid = 1 

Ce me semble que cela pourrait être un appel à forte intensité de ressources à la DB si vous avez beaucoup d'utilisateurs et amis tirant ces données. Je sais qu'il y a la possibilité d'avoir une paire d'entrées pour chaque relation d'ami mais j'essaye de le faire en une fois. Avez-vous des idées sur la façon d'améliorer les structures de requête ou de table pour améliorer les performances. Ou peut-être que ce ne sera pas aussi mauvais que je le prévois?

+2

Assurez-vous que vous avez des index sur 'friends.memberid', 'friends.friendid' et' members.memberid'. – eggyal

+0

Bon appel eggyal – Naterade

Répondre

5

En plus de mon commentaire ci-dessus pour vous informer de créer des index sur friends.memberid, friends.friendid et members.memberid, vous n'avez pas besoin UNION du tout:

SELECT m.name 
FROM members AS m JOIN friends AS f 
    ON (m.memberid, 1) IN ((f.friendid, f.memberid), (f.memberid, f.friendid)) 
+0

Excellent, apprenez quelque chose de nouveau tous les jours! – Naterade

+0

+1 pour l'utilisation des constructeurs de lignes – goat

Questions connexes