Самое простое, что можно попробовать - использовать небуферизованные запросы. Затем mysql начнет доставлять данные, как только сможет, а не тогда, когда все будет готово (и буферизовано). В зависимости от вашего запроса это может не помочь.
Чтобы действительно ускорить процесс, вам нужно разбить запрос. Не только использование LIMIT, это не сэкономит вам много времени в зависимости от вашего запроса. Например, если у вас есть ORDER BY, почти весь набор результатов должен быть рассчитан в первую очередь. Вы сэкономите только время, необходимое для доставки меньшего количества данных по сети.
Разделите ваши запросы, выполнив фильтр. Если у вас есть индексированное поле, в котором вы можете выполнять поиск по диапазону (то есть с автоинкрементом), разбейте ваш запрос на несколько запросов, используя это поле. Например:
SELECT * FROM db WHERE field1 BETWEEN 1 AND 10000;
SELECT * FROM db WHERE field1 BETWEEN 10000 AND 20000;
...
Затем вы можете объединить результаты позже. Много раз такие запросы выполняются быстрее, чем эквивалентный одиночный запрос. Но если у вас есть ORDER BY или GROUP BY, это может быть невозможно.
Но вы все равно можете попробовать разбить его на более мелкие запросы, объединить их с UNION и выбрать UNION с вашей группировкой и упорядочить по. Верьте или нет, это все еще может быть намного быстрее, чем эквивалентный одиночный запрос. Вам просто нужно, чтобы отдельные запросы обрабатывали достаточно маленький набор данных, чтобы сделать их быстрыми.
SELECT field1, SUM(field3) field3, SUM(item_count) item_count FROM
(
SELECT field1, SUM(field3) field3, COUNT(item) item_count FROM db WHERE field1 BETWEEN 1 AND 10000 GROUP BY field1
UNION
SELECT field1, SUM(field3) field3, COUNT(item) item_count FROM db WHERE field1 BETWEEN 10000 AND 20000 GROUP BY field1
UNION
...
) AS sub_queries GROUP BY field1
Разделяй и властвуй. Используя эту технику, я иногда сокращал время запроса с часа до минуты или двух.