Hallo Thomas,
skadate_members hat 46 Spalten und 11 213 Datensätze.
skadate_friends hat 4 Spalten und 21 962 Datensätze.
cometchat_status hat 4 Spalten und 413 Datensätze.
danke; zusammen mit deiner Beschreibung, was die Anfrage machen soll, bekomme ich ein besseres Bild von der Situation. Ist folgendes richtig?
„members“ enthält alle Mitglieder (irgendeiner Community), „friends“ ist eine n:m-Beziehung zwischen Mitgliedern, die gerichtet ist, und stellt eine Einladung zur Freundschaft dar, die entweder noch unbeantwort ist (pending = 1) oder schon angenommen (pending = 0). In „status“ ist für einige wenige der Mitglieder (4 %; alle die online sind?) ihr Status hinterlegt.
Du möchtest alle Freunde von Mitglied 1 finden, wobei du „Freundschaft“ über beide Richtungen der Beziehung in „friends“ definierst (es sollen also sowohl Mitglieder gefunden werden, die Mitglied 1 erfolgreich eingeladen hat, als auch solche, die selbst Mitglied 1 erfolgreich eingeladen haben). Zu den Mitgliedern, zu denen es einen Status gibt, soll zusätzlich dieser Status ausgegeben werden.
Soweit richtig?
Das hätte ich an deiner Stelle so formuliert, damit die Verständlichkeit und Übersichtlicht gewahrt bleibt:
select m.member\_id userid, m.username username, m.lastvisit lastactivity,
m.member\_id avatar, m.member\_id link, s.message, s.status
from skadata\_members m left join cometchat\_status s on m.member\_id = s.userid
where m.member\_id in (
select friend\_id
from skadate\_friends
where member\_id = 1
and pending = 0
union all
select member\_id
from skadate\_friends
where friend\_id = 1
and pending = 0
)
Dann hätte ich darauf geachtet, dass auf friends.member_id, friends.friend_id, members.member_id und status.userid Indexe existieren.
Wenn dann wider Erwarten die Performance noch nicht stimmt, würde ich mir wie Joey die Ausführungspläne anschauen.
Viele Grüße,
Andreas
PS:
Dann habe ich das mit UNION versucht zu lösen aber da wurde
mir gesagt das UNION ganz schlecht ist.
Auf solche pauschalen Aussagen sollte man nicht blind vertrauen. Auf jeden Fall solltest du den Unterschied zwischen UNION und UNION ALL kennen (ersteres eliminiert Duplikate, was teuer sein kann). In meiner Anfrage ist es egal (sofern der Optimierer gut ist; ich weiß nicht, wie es bei MySQL da aussieht).