TL; DR:
Wykorzystują architekturę stosu z pamięci podręcznej wykresów dla wszystkich powyżej dna MySQL ich stos.
Długa odpowiedź:
Zrobiłem kilka badań na ten sam, bo byłem ciekaw, jak radzą sobie z nimi ogromne ilości danych i szukać go w szybki sposób. Widziałem ludzi, którzy narzekają na zlecenie wykonane skryptów społecznościowych staje się powoli, gdy baza użytkowników rośnie. Po zrobiłem niektóre benchmarking się z zaledwie 10k użytkowników i 2,5 mln przyjaciel połączeń - nawet nie próbują przejmować uprawnień grupowych i lubi i słupków ściennych - szybko okazało się, że takie podejście jest błędne. Więc spędziłem trochę czasu szukając w internecie o tym, jak zrobić to lepiej i natknąłem się na to oficjalnej artykule Facebooku:
I naprawdę polecam do obejrzenia prezentacji pierwszego linku powyżej przed kontynuować czytanie. To chyba najlepszy wyjaśnienie sposobu FB działa za kulisami można znaleźć.
Film i artykuł powie Ci kilka rzeczy:
- Oni używają MySQL na samym dnie swojego stosu
- Powyżej SQL DB jest warstwa TAO, która zawiera co najmniej dwa poziomy buforowania i jest za pomocą wykresów w celu opisania połączenia.
- Nie mogłem znaleźć nic na temat oprogramowania / DB faktycznie używać ich pamięci podręcznej wykresach
Rzućmy okiem na to, kontaktów są u góry z lewej:

Cóż, jest to wykres. :) To nie powiedzieć, jak ją zbudować w SQL, istnieje kilka sposobów, aby to zrobić, ale ta strona zawiera sporą ilość różnych podejść. Uwaga: Należy rozważyć, że relacyjnych DB to co to jest: Uważa się, znormalizowane do przechowywania danych, a nie strukturę wykresu. Więc nie będzie tak dobry jak wykonać wyspecjalizowanej bazie wykresu.
Weź również pod uwagę, że trzeba zrobić bardziej złożonych zapytań niż tylko przyjaciółmi przyjaciół, na przykład gdy chcesz filtrować wszystkie lokalizacje wokół dana współrzędna że ty i twoi znajomi znajomych podobnych. Wykres jest idealnym rozwiązaniem tutaj.
Nie mogę powiedzieć, jak ją zbudować tak, że będzie dobrze wykonać, ale to wyraźnie wymaga prób i błędów i benchmarking.
Oto mój rozczarowujące test zaledwie ustaleń znajomych znajomych:
DB schematu:
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;
Znajomi znajomych zapytanie:
(
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
)
Naprawdę polecam Ci stworzyć Ci kilka przykładowych danych z co najmniej 10k rejestrów użytkowników, a każdy z nich posiada połączenia co najmniej 250 przyjaciół, a następnie uruchomić tę kwerendę. Na moim komputerze (4770k i7, SSD, 16GB RAM) wynik był ~ 0,18 sekundy dla tego zapytania. Może to być zoptymalizowane, nie jestem geniuszem dB (sugestie są mile widziane). Jednakże, jeśli ten Wagi liniowe jesteś już w 1,8 sekundy za jedyne 100k użytkowników, 18 sekund do 1 miliona użytkowników.
To może nadal wydawać OKish za ~ 100k użytkowników, ale uważają, że po prostu ściągnięcie ich przyjaciół i nie robić nic więcej skomplikowane zapytania jak " wyświetlają mi stanowisk tylko z przyjaciółmi przyjaciół + zrobić sprawdzanie uprawnień, jeśli wolno mi lub niedozwolone aby zobaczyć niektóre z nich + sub zrobić kwerendę, aby sprawdzić, czy lubiłem każdy z nich ”. Chcesz pozwolić DB zrobić czek na razie podoba Ci się post już, czy nie, bo trzeba zrobić w kodzie. Weź również pod uwagę, że to nie jest tylko zapytanie biegać i że Twój mieć więcej niż aktywnego użytkownika w tym samym czasie na bardziej lub mniej popularnej stronie.
Myślę, że moja odpowiedź odpowiedzi na pytanie, jak Facebook zaprojektowane ich relacji znajomych bardzo dobrze, ale przykro mi, że nie mogę ci powiedzieć, jak wdrożyć je w taki sposób, że będzie działać szybko. Wdrożenie sieci społecznej jest łatwe, ale upewniając się, że dobrze wykonuje wyraźnie nie jest - IMHO.
Zacząłem eksperymentować z OrientDB zrobić wykres-zapytań i mapowanie moje krawędzie podstawowej SQL DB. Jeśli kiedykolwiek zrobić to ja napiszę o tym artykuł.