TL; DR:
Ők egy verem architektúra cache grafikonok mindent feletti MySQL alján a verem.
Hosszú válasz:
Utánanéztem ezen magam, mert kíváncsi voltam, hogy hogyan kezelik a hatalmas mennyiségű adat és keressen meg egy gyors módja. Láttam az emberek panaszkodnak egyedi social network scriptek válik lassan, ha a felhasználói bázis növekszik. Miután tettem néhány összehasonlító magam csak 10k felhasználó és 2,5 millió barátja kapcsolatok - nem is próbál törődni csoport engedélyek és kedvel és falra hozzászólás - ez hamar kiderült, hogy ez a megközelítés hibás. Szóval egy ideig keresnek az interneten, hogyan lehet jobban csinálni, és rábukkantam erre a hivatalos Facebook cikket:
Azt nagyon ajánlom, hogy nézze meg a bemutatót az első fenti link előtt olvasson tovább. Valószínűleg ez a legjobb magyarázat, hogyan működik FB a színfalak mögött megtalálja.
A videó és a cikk beszámol arról, néhány dolgot:
- Ők MySQL a nagyon alsó azok verem
- Fent az SQL DB van a Tao réteg, amely tartalmaz legalább két szintjét cache és használja grafikonok, hogy leírja a kapcsolatokat.
- Én nem találtam semmit, hogy milyen szoftver / DB valójában használni való gyorstárazott grafikonok
Vessünk egy pillantást a, ismerősöd van a bal felső sarokban:

Nos, ez egy gráf. :) Azt nem mondja meg, hogyan kell építeni az SQL, számos módja van, de ezen az oldalon van egy jó adag különböző megközelítéseket. Figyelem: Vegye figyelembe, hogy a relációs DB mi ez: Úgy tartják, hogy tárolja a normalizált adatok nem gráfstruktúra. Tehát nem végez olyan jó, mint egy speciális gráf tárol.
Továbbá úgy vélik, hogy meg kell csinálni bonyolultabb lekérdezéseket, mint a barátok barátai, például ha azt szeretné, hogy kiszűrje az összes helyszínen mintegy egy adott koordináta, hogy Ön és a barátok barátai, mint a. A grafikon a tökéletes megoldást.
Nem tudom megmondani, hogyan kell elkészíteni úgy, hogy jól fognak teljesíteni, de ez egyértelműen megköveteli néhány próbálgatással és teljesítményértékelés.
Itt van a kiábrándító teszt csak megállapítások barátok barátai:
DB séma:
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;
Ismerősök ismerősei Keresés:
(
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
)
Nagyon ajánlom, hogy hozzon létre egy kis mintát adatok legalább 10k felhasználói bejegyzések és mindegyikük legalább 250 ismerősöd, majd futtatni ezt a lekérdezést. Az én gépemen (i7 4770k, SSD, 16GB RAM) volt az eredmény ~ 0,18 másodperc az adott lekérdezés. Lehet, hogy optimalizálni lehet, én nem a DB zseni (javaslatot szívesen). Azonban , ha ez a mérleg lineáris te már 1,8 másodperc alatt mindössze 100k felhasználók, 18 másodperc, 1 millió felhasználó.
Ez talán még mélyen OKish a ~ 100k felhasználók számára, de úgy, hogy csak erőltetett barátok barátai, és nem csinál semmi bonyolultabb lekérdezést, mint a " megjelenítéséhez csak nekem bejegyzéseit barátok barátai + do engedélye csekket, ha én engedélyezett vagy nem engedélyezett hogy néhány közülük + csinálni egy sub lekérdezést, ha szeretné ellenőrizni tetszett ezek közül bármelyik .” Azt akarja, hogy a DB tenni az ellenőrzést, ha tetszett a poszt már vagy sem, akkor meg kell tennie a kódot. Továbbá úgy vélik, hogy nem ez az egyetlen lekérdezés fut, és hogy a több, mint aktív felhasználó egyidejűleg egy többé-kevésbé népszerű site.
Azt hiszem, a válasz a kérdésre ad választ, hogyan Facebook tervezték a barátok kapcsolata nagyon jól, de sajnálom, hogy nem tudok mondani, hogyan valósítható meg oly módon, hogy működni fog gyorsan. Megvalósítása a szociális háló könnyű, de ügyelve arra, hogy jól teljesít nyilvánvalóan nem - IMHO.
Már kezdett kísérletezni OrientDB csinálni a gráf-lekérdezések és feltérképezése én élek a mögöttes SQL DB. Ha valaha is ez történik írok egy cikket róla.