Простейшей задачей является использование небуферизованных запросов. Затем 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
Разделить и завоевать. Используя эту технику, я иногда сокращал время запроса от часа до минуты или двух.
Почему вы не разделили результат с помощью LIMIT? – Moak
@Moak: Благодарю вас за идею! Но мы пробовали это и, к сожалению, это не сработало. Добавление «LIMIT 0, one_fifth_of_the_returned_records» к запросу выполняется так же долго, как тот же запрос без LIMIT. Он * не * производит первую пятую часть результатов за более короткий период времени. – laramichaels
Было бы намного легче избежать «психологических ответов» здесь, если бы вы могли опубликовать один из долговременных запросов в его полной форме. –