Не понял как товарища blackx откомментировать напрямую. Отвечу здесь.
Смысл вообще задачи - никогда не повторять виденное, показывая статьи по фильтру и условию сортировки. Все записи не нужны конечно, нужно 100 - 1000 записей для создания очереди просмотров. Выдача проста из заранее сгенерированной очереди, но при смене фильтров большой лаг на саму выборку для очереди.
И еще. Все сразу не нужны вроде, а как найти полмиллиона непрочитанных записей исходя из таблицы прочитанных? Выбрать из записей те которые не вот эти полмиллиона.
Очевидно очевидными способами уже тестили. Именно по результату очевидных тестов и возникли вопросы.