Журнал активности может содержать очень большое количество записей, поскольку в нем обычно содержатся сведения о деятельности текущего пользователя и всех его друзей. Если вы объединяете разные таблицы, и у пользователя есть сотни друзей, это может привести к извлечению большого количества данных.
Одним из подходов является денормализация данных и обработка их как одного большого журнала, в котором все записи, которые должны появиться на странице журнала активности пользователя, будут сохранены в таблице журнала активности для этого пользователя. Например, если у пользователя A есть два друга, пользователь B и пользователь C, когда пользователь A делает что-то, создаются три записи журнала активности:
record 1: "I did this" log for user A
record 2: "My friend did this" log for user B
record 3: "My friend did this" log for user C
Вы получите дубликаты, но это не имеет значения. Это быстро выбрать, поскольку он из одной таблицы и проиндексирован только по идентификатору пользователя. И, скорее всего, вы будете вести таблицу журнала активности (т.е. удалять записи старше 1 месяца).
Таблица журнала активности может выглядеть примерно так:
-id
-user_id (user who's activity log this is)
-action_user_id (user who took the action, or null if same as user_id)
-activity_type
-date
Выбрать все последние журналы активности для одного пользователя очень просто:
SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50
Чтобы сделать этот подход действительно эффективным, вам нужно иметь достаточно информации в единой таблице журнала активности, чтобы не требовалось никаких дальнейших выборов. Например, вы можете хранить необработанное сообщение журнала, а не создавать его на лету.