Задача: быстро показать все посты друзей пользователя, отсортированные по дате (френдлента).
Всё осложняется несколькими пунктами:
1) у пользователей может быть куча друзей (тысячи)
2) у пользователей может быть куча постов (тоже тысячи)
3) они могут захотеть *неожиданно* посмотреть посты из френдленты с 1000 по 1010.
Какие идеи я уже отмела:
0) гугль по запросу «алгоритм френдленты» и «algorithm friendline» ничего не находит.
1) Простой JOIN не подойдёт так как будет тормозить сортировка всех постов по дате.
2) Можно добавить табличку (friendline: UID, PID, date) с индексом (UID, date) и быстро искать по ней. Но тогда добавление/удаление френда с 1000 постов надолго заставит её задуматься.
Обычно такие вещи кладутся в отдельную таблицу (называйте это кешем или еще как-то), и не удаляйте из нее, а помечайте удаленным. Ну и шардинг для нее если совсем уж много данных.
Это как раз мой вариант 2. Помечать удалёнными и позже отложено удалять — можно. Но тогда добавление френда с 1000 постов или будет занимать кучу времени (на вставку 1000 записей и их сортировку), или не будет появляться в френдленте (если вставка будет отложенной).
У топовых пользователей ЖЖ десятки тысяч френдов. По вашему алгоритму при вставке новой записи в блог надо добавить 10 000 записей в табличку. Мне кажется это многовато…
1. Вставка на 1000 записей произойдет мгновенно, потому как вам надо не все данные хранить а лишь айдишники.
2. Поэксперементируйте с запросами:
2а. выбрать айдишники всех друзей
2б. выбрат по айди всех друзей (да да, как бы смешно не звучало)
2в. выбрать активность ленты
Иногда такие 3 запросы работают быстрей чам один джойн
3. «они могут захотеть *неожиданно* посмотреть посты из френдленты с 1000 по 1010.» — забейте
4. Если сообщения не изменяемые, то нет смысла сортировать по дате, первичный числовой ключ надеюсь есть? он всегда больше у последних записей
Это все что сходу в голову пришло.