TL; DR:
Они используют архитектуру стека кэшированных графиков все выше дна MySQL их стека.
Длинный ответ:
Я сделал некоторые исследования по этому вопросу, потому что самому мне было интересно , как они обрабатывают их огромное количество данных , и искать его в быстром способе. Я видел , что люди жалуются на заказ социальные сети сценариев становится медленной , когда пользовательская база растет. После того как я сделал некоторые бенчмаркинг себя с только 10к пользователей и 2,5 миллиона другу соединений - даже не пытается беспокоиться о правах доступа группы и симпатиях и стенных посты - это быстро оказалось, что этот подход является ошибочным. Так что я провел некоторое время на поиск в Интернете о том , как сделать это лучше и наткнулся на эту статью официальной Facebook:
Я действительно рекомендую вам посмотреть презентацию первой ссылки выше , прежде чем продолжить чтение. Это, вероятно , самое лучшее объяснение того , как работает FB за кулисами вы можете найти.
Видео и статья говорят вам несколько вещей:
- Они используют MySQL в самом низу их стека
- Выше в SQL DB есть слой ТАО , который содержит , по меньшей мере , два уровня кэширования и используют графики для описания соединений.
- Я не мог найти ничего о том, что программное обеспечение / DB они фактически используют для своих кэшированных графиков
Давайте посмотрим на это, друг соединения вверху слева:

Ну, это граф. :) Это не говорит вам , как построить его в SQL, есть несколько способов сделать это , но этот сайт имеет хорошее количество различных подходов. Внимание: Учтите , что реляционная БД, что это такое: Считается , хранить нормализованные данные, а не структуру графа. Поэтому он не будет выполнять так же хорошо , как специализированная базу данных графа.
Также считаю, что вы должны делать более сложные запросы, чем просто друзья друзей, например, когда вы хотите, чтобы отфильтровать все места вокруг заданной координаты, что вы и ваши друзья друзей, как. Граф является идеальным решением здесь.
Я не могу сказать вам, как построить его так, что он будет хорошо работать, но это явно требует некоторых проб и ошибок и бенчмаркинга.
Вот мое разочарование тест для всего выводов друзей друзей:
DB схемы:
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;
Друзья Друзей запроса:
(
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
)
Я очень рекомендую вам создать вам некоторые выборочные данные по крайней мере 10k записей пользователей , и каждый из них имеет , по меньшей мере , 250 соединения друга , а затем запустить этот запрос. На моей машине (i7 4770k, SSD, 16gb RAM) результат был ~ 0,18 секунды для этого запроса. Может быть , это может быть оптимизирован, я не гений DB (предложения приветствуются). Однако, если эти весы линейны вы уже в 1,8 секунде для всего 100k пользователей, 18 секунд , 1 млн пользователей.
Это может звучать по- прежнему OKish для ~ 100k пользователей , но считают , что вы просто надуманные друзья друзей и не делать ничего более сложный запрос , как " отображать меня только посты от друзей друзей + сделать проверку прав доступа , если я разрешено или не разрешено чтобы увидеть некоторые из них + сделать запрос к югу , чтобы проверить , нравится ли мне какие - либо из них ». Вы хотите , чтобы позволить DB сделать чек, если вы понравился пост уже или нет , вы должны сделать в коде. Также считаю , что это не единственный запрос запуска , и что ваш имеют более активного пользователя , в то же время на более или менее популярной.
Я думаю, что мой ответ отвечает на вопрос, как Facebook разработаны их друзья отношения очень хорошо, но мне жаль, что я не могу сказать вам, как осуществить это таким образом, он будет работать быстро. Реализация социальной сети легко, но убедитесь, что он хорошо работает явно не - ИМХО.
Я начал экспериментировать с OrientDB сделать граф-запросы и отображение моих краев к основной БД SQL. Если я когда-нибудь это сделать я напишу статью об этом.