TL; DR:
Ei folosesc o arhitectura stivă cu grafice stocate în memoria cache pentru tot mai sus în partea de jos a MySQL stiva lor.
Raspuns lung:
Am făcut niște cercetări pe această mine pentru că am fost curios modul în care acestea se ocupe de valoarea lor foarte mare de date și de căutare într - un mod rapid. Am văzut oameni plângându personalizate script - uri de rețele sociale devine lent atunci când baza de utilizatori crește. După ce am făcut unele eu evaluarea comparativă cu doar 10k utilizatori și 2,5 milioane de prietenul conexiuni - nici măcar nu încearcă să deranjeze despre permisiunile și gusturilor de grup și posturi de perete - sa dovedit repede că această abordare este eronată. Așa că am petrecut ceva timp în căutarea pe web cu privire la modul de a face mai bine și a venit peste acest articol oficial Facebook:
Eu într - adevăr vă recomandăm să urmăriți prezentarea primului link - ul de mai sus înainte de a continua lectura. Este , probabil , cea mai bună explicație a modului în care funcționează FB în spatele scenei puteți găsi.
Video și articol vă spune câteva lucruri:
- Ei folosesc MySQL chiar în partea de jos a stivei lor
- Deasupra SQL DB există stratul TAO care conține cel puțin două nivele de cache - și utilizează grafice pentru a descrie conexiunile.
- Nu am putut găsi nimic pe ce software / DB care le utilizează efectiv pentru graficele lor stocate în memoria cache
Să aruncăm o privire la acest lucru, legături de prietenie sunt stânga sus:

Ei bine, acest lucru este un grafic. :) Nu vă spune cum să - l construiască în SQL, există mai multe moduri de a face acest lucru , dar acest site are o cantitate bună de abordări diferite. Atenție: Luați în considerare faptul că o DB relațională este ceea ce este: Se crede ca pentru a stoca date normalizate, nu o structură grafic. Deci, nu se va efectua la fel de bun ca și o bază de date grafic specializat.
De asemenea, considerăm că trebuie să faci interogări mai complexe decât doar prieteni de prieteni, de exemplu, atunci când doriți să filtrați toate locațiile în jurul unei coordonate pe care tu și prietenii tăi de prieteni, cum ar fi. Un grafic este soluția perfectă aici.
Nu pot să vă spun cum să-l construiască astfel încât acesta va funcționa bine, dar necesită în mod clar o anumită încercare și eroare și analiza comparativă.
Aici este meu dezamăgitor test pentru doar constatări prietenii prietenilor:
DB schemă:
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;
Prietenii prietenilor interogare:
(
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
)
Chiar recomandăm să creați unele date eșantion cu cel puțin 10k înregistrări ale utilizatorilor și fiecare dintre ele având cel puțin 250 de legături de prietenie și apoi executați această interogare. Pe masina mea (4770k i7, SSD, RAM de 16 GB) , rezultatul a fost de ~ 0.18 secunde pentru acea interogare. Poate că poate fi optimizat, eu nu sunt un geniu DB (sugestii sunt binevenite). Cu toate acestea, în cazul în care această cântare liniar esti deja la 1,8 secunde pentru doar 100k utilizatori, 18 secunde pentru 1 milion de utilizatori.
Acest lucru ar putea suna în continuare OKish pentru utilizatorii ~ 100k dar consideră că sunteți doar prieteni preluate de prieteni și nu a făcut nici o interogare mai complexe cum ar fi " afișează - mi doar mesajele de la prietenii prietenilor + face verificarea permisiunea dacă am voie sau nu este permisa pentru a vedea unele dintre ele + face o interogare de sub pentru a verifica dacă mi -a plăcut nici una dintre ele “. Vrei să lase PB face verificarea dacă ți -a plăcut pe un post deja sau nu , sau va trebui să facă în cod. De asemenea , consideră că acest lucru nu este singura interogare executată și că dvs. au mai mult de utilizator activ, în același timp , pe un site mai mult sau mai puțin popular.
Cred că răspunsul meu răspunde la întrebarea cum Facebook proiectat relația lor prieteni foarte bine, dar îmi pare rău că nu vă pot spune cum să-l pună în aplicare într-un mod va funcționa rapid. Implementarea unei rețele sociale este ușor, dar asigurându-vă că funcționează bine, nu este în mod clar - IMHO.
Am început să experimenteze OrientDB să facă graficul-interogări și cartografiere marginile mele PB SQL care stau la baza. Dacă am vreodată făcut-o să scrie un articol despre asta.