Давай обстрагируемся немного, представь что у тебя только 1 юзер, и он смотрит контент, смотреть он его может конечно и не в хронологическом порядке наприммер посмотрел c9, потом с5, c6, c4, c7, c8. Теперь если ты можешь хранить просмотренный контент в хронологическом порядке его создания с1 … cN, тебе приходит запрос на фильтрацию нового контента к примеру c5 - c35, ты сразу понимаешь что последний просмотренный контент c9, отбрасываешь все что новее как точно не просмотренное и только c5 - c9 нужно проверить есть ли в нашем наборе данных, так как набор данных упорядочен, ты можешь делать это очень эффективно не перебирая всю историю. Утрированно например двоичный поиск с5 и далее от него и до конца истории проходишь по куску данных.
Здесь даже binary search не нужен. Тупо смотреть разницу между двумя сетами.