Вот такие мысли на текущий момент.
Обрабатывать данные порционально, в небольших временных интервалах, то есть за раз, скажем, в процессинге будут учавствовать данные не более, чем за неделю.
Структура будет гибридной.
events {id, date, user_id, type_id, content}
type_id - категория события (они более менее фиксированные и их не более 50-100: удаление пользователя, добавление пользователя, редактирование пользователя, удаление группы, добавление группы, редактирование группы, смена прав для группы и т.д.).
content - сериализованный объект события, базовый тип которого LogEvent.
Фильтр будет состоять из даты, пользователя, категорий событий, а так же динамически сгенерированных фильтров конкретных классов событий, например "редактирование флага активации пользователя".
При использовании фильтров только по дате, пользователю и категориям событий фильтрация будет осуществляться БД, что, естественно, ускорит выборку.
Как пользователь выбирает что-то из динамических фильтров конкретных классов, выборка БД осуществляется только по дате (ну может еще и пользователю) и фильтр уже применяется для каждой записи.
Как то так, сумбурно.
Посмотрим, что из этого выйдет. Может быть будут корректировки по мере процесса разработки.