TL; DR:
Sie verwenden eine Stack-Architektur mit Cache gespeicherten Graphen für alles über der MySQL Unterseite ihrer Stack.
Lange Antwort:
Ich habe auf diesen einige der Forschung selbst , weil ich neugierig war , wie sie ihre große Menge an Daten verarbeiten und es in einer schnellen Art und Weise suchen. Ich habe Leute über Maß soziale Netzwerk Skripte beschweren gesehen langsam wird , wenn die Nutzerbasis wächst. Einige Benchmarking mich mit Nachdem ich tat nur 10k Nutzer und 2,5 Millionen Freund Verbindungen - nicht einmal versuchen , über Gruppenberechtigungen und Vorlieben und Wandpfosten zu stören - es stellte sich schnell heraus , dass dieser Ansatz fehlerhaft ist. Also habe er einige Zeit mit der Suche im Internet verbracht, wie man es besser machen und kam in diesem offiziellen Facebook - Artikel:
Ich wirklich empfehlen Sie oben vor weiter lesen die Präsentation der ersten Verbindung zu beobachten. Es ist wahrscheinlich die beste Erklärung, wie FB den Kulissen arbeitet hinter Sie finden können.
Das Video und Artikel erfahren Sie, ein paar Dinge:
- Sie sind mit MySQL ganz am unteren Rand ihres Stapels
- Oberhalb der SQL - DB gibt es die TaO - Schicht , die wenigstens zwei Ebenen von Zwischenspeichern enthält und unter Verwendung von Graphen , die die Verbindungen zu beschreiben.
- Ich konnte nichts auf finden, welche Software / DB sie für ihre gecached Graphen tatsächlich nutzen
Lassen Sie uns einen Blick auf diese, Freund Verbindungen sind oben links:

Nun, dies ist eine grafische Darstellung. :) Es ist Ihnen nicht sagen , wie es in SQL zu bauen, gibt es mehr Möglichkeiten , es zu tun , aber diese Seite hat eine gute Menge an unterschiedlichen Ansätzen. Achtung: Bedenken Sie, dass eine relationale DB ist , was es ist: Es wird vermutet , normalisieren Daten zu speichern, nicht eine Graphenstruktur. So wird es nicht so gut wie eine spezialisierte Graph - Datenbank durchführen.
Sehen Sie sich auch, dass Sie komplexere Abfragen als nur Freunde von Freunden, zum Beispiel zu tun haben, wenn Sie koordinieren alle Positionen um eine gegebene filtern möchten, dass Sie und Ihre Freunde von Freunden wie. Ein Graph ist die perfekte Lösung.
Ich kann Ihnen nicht sagen, wie es zu bauen, so dass es gut funktionieren wird, aber es erfordert eindeutig einige Versuch und Irrtum und Benchmarking.
Hier ist mein enttäuschender Test für nur Erkenntnisse Freunde von Freunden:
DB-Schema:
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Freunde von Freunden Abfrage:
(
select friend_id
from friends
where user_id = 1
) union (
select distinct ff.friend_id
from
friends f
join friends ff on ff.user_id = f.friend_id
where f.user_id = 1
)
Ich empfehle Ihnen wirklich Sie einige Beispieldaten mit mindestens 10k Benutzerdatensätzen zu erstellen und jeder von ihnen mindestens 250 Freund Verbindungen aufweist , und dann diese Abfrage ausführen. Auf meinem Rechner (i7 4770k, SSD, 16 GB RAM) war das Ergebnis ~ 0,18 Sekunden für die Abfrage. Vielleicht kann es optimiert werden, ich bin kein Genie DB (Vorschläge sind willkommen). Doch wenn diese Skalen linear sind Sie bereits bei 1,8 Sekunden nur 100k Benutzer, 18 Sekunden für 1 Million Benutzer.
Dies könnte noch klingen OKish für ~ 100k Nutzer aber bedenken , dass Sie nur geholt Freunde von Freunden und nicht wie "mehr komplexe Abfrage tat mir angezeigt werden nur Beiträge von Freunden von Freunden + die Berechtigungsprüfung tun , wenn ich darf oder nicht erlaubt einige von ihnen zu sehen + tun , um eine Sub - Abfrage zu überprüfen , ob ich einen von ihnen gemocht “. Sie wollen , dass die DB tun , um die Überprüfung zu lassen , wenn Sie einen Beitrag bereits gefallen hat oder nicht , oder Sie werden in Code zu tun haben. Sehen Sie sich auch , dass dies nicht die einzige Abfrage Sie laufen und dass Ihre mehr als aktiver Benutzer zur gleichen Zeit auf einer mehr oder weniger populären Seite.
Ich denke, meine Antwort auf die Frage beantwortet, wie Facebook ihre Freunde Beziehung entwickelt, um sehr gut, aber es tut mir leid, dass ich Ihnen nicht sagen, wie es in einer Weise zu implementieren, es schnell funktioniert. ein soziales Netzwerk Die Implementierung ist einfach, aber sicherstellen, dass es gut ist, führt eindeutig nicht - IMHO.
Ich habe damit begonnen, die Graph-Abfragen experimentieren mit Orientdb zu tun und Abbilden meine Kanten auf die zugrunde liegende SQL-DB. Wenn ich es jemals getan werde ich einen Artikel darüber schreiben.