Делать построчно, и сохраняй результат выполнения в отдельную таблицу. Даже если упадëт - будешь знать на каком этапе остановилось и продолжишь с предыдущей строки, а последнюю удалишь, ибо хз, обработалась ли она до конца.
есть несколько вариантов: 1) один или несколько view из нужных тебе таблиц на чистом SQL, где отобразишь только нужные тебе данные для группировки, затем запрос к этому view и считай. Это явно быстро. 2) построчно - долго и геморройно и все равно придется за памятью следить
Аналитика - это про olap. Варианты на sql уже предложили. Но ещё лучше перекладывать эти данные в отдельные таблицы / базы (например колоночные) и оттуда очень быстро выбирать эти данные
идеальный вариант — это создать индексы, чтоб джойнилось всё легко, соптимизировать запросы, утащить обсчёт или хотя бы его часть в базу, и обрабатывать всё построчно, держа в памяти только текущую строку. но можно и модных костылей накидать, да =)
курсор не спасет от перегруза базы и объедания памяти не на стороне php, а драйвера который заберет данные из базы (приэтом сожрав память сервера), а потом дозировано будет отдавать в php