Помимо описанных в других ответах LIMIT и OFFSET есть еще такая вещь как курсор.
Курсор позволяет читать строки по одной, но требует открытого соединения с СУБД.
На самом деле большинство СУБД в ответ на запрос возвращают именно курсор, просто функции из библиотеки, которая работает с СУБД, вычитывают курсор до конца, если смысл таких функций вернуть массив строк из результата запроса.
Курсор штука ленивая, то есть поиск следующей строки СУБД будет делать только в тот момент, когда у нее попросят следующую строку для курсора.
В случае если у нас есть постоянный коннект к СУБД, вариант запросить сразу все и потом дергать курсор понемногу будет работать быстрее чем множество запросов с LIMIT, так как СУБД будет лишь единожды анализировать запрос, подбирать подходящие для него индексы и т.д.
То есть в Вашем случае нужно сначала понять, можно ли гарантированно поддерживать коннект к СУБД между ивентами.
Если да, то отправляете в СУБД запрос и получаете курсор перед подпиской на ивент, а в хендлере самого ивента уже дергаете курсор по 5 раз.
Если нет, то на каждый ивент отправляете запрос с LIMIT и OFFSET.