Ich habe ein bisschen ein Problem mit einer Abfrage und Skalierung dieser Abfrage für die Leistung mit Benutzern mit einer hohen Anzahl von Freunden. Das Ziel der Abfrage ist die Top „-Aktivitäten von deinen Freunden in den letzten 30 Tagen durchgeführt greifen Hier ist meine Frage:.MySQL-Optimierung für soziale Freunde Graph (Gruppe von Freunden)
SELECT a.activity_id, b.activity_name, count(a.activity_id) as total_count
FROM friends as f
INNER JOIN activities as a on (a.user_id = f.friend_id
and a.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
INNER JOIN activity as b on a.activity_id = b.activity_id
WHERE f.user_id = 1 and f.is_approved = 1
GROUP by a.activity_id
ORDER by total_count DESC
LIMIT 5
Diese Abfrage dauert wie 25 Sekunden für alle Benutzer, egal wie groß oder klein laufen ihre Freunde graph ist Indizes sind unter:.
Table: activities
PRIMARY: [act_id] Other: [activity_id, user_id], [user_id, created_at], [created_at]
Table: friends
PRIMARY: [user_id, friend_id] Other: [user_id, is_approved], [friend_id]
Table: activity:
PRIMARY: [activity_id]
Jede Hilfe sehr geschätzt
UPDATE würde. Hier ist die erklären
id select_type table key key_len ref rows Extra
1 SIMPLE F ref friend_lookup 5 const,const 795 Using temporary; Using filesort
1 SIMPLE A ref user_id 4 F.friend_id 58 Using where
1 SIMPLE B eq_ref PRIMARY 4 P.activty_id 1 Using where
Vielleicht führen Sie eine EXPLAIN [Abfrage], so dass wir sehen können, was der Abfrageplaner macht? –
Plz fügen Sie das EXPLAIN-Ergebnis hinzu, um zu bekommen, wie der Motor die Daten holt –
Ich habe die Erklärung oben hinzugefügt. Nicht viele Zeilen für mich - aber dauert mehr als 25 Sekunden abzufragen. – gregavola