частичные результаты от длительного запроса SELECT? - PullRequest
2 голосов
/ 29 января 2010

Мы выдаем несколько длительных запросов к базе данных mysql. (Контекстом является анализ данных в автономном режиме, а не приложение.) То, как мы будем действовать в терминах исследования, зависит от результатов, которые мы получаем на этом пути. Нам было бы полезно иметь возможность просматривать (частичные) результаты , поскольку они генерируются оператором SELECT - до завершения запроса.

Возможно ли это? Или мы застряли в ожидании, пока запрос не завершится (что, учитывая размер набора данных, может занять несколько часов), чтобы просмотреть результаты, которые были сгенерированы в первые секунды его выполнения?

Спасибо за любую помощь.

Ответы [ 4 ]

5 голосов
/ 30 января 2010

Самое простое, что можно попробовать - использовать небуферизованные запросы. Затем 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

Разделяй и властвуй. Используя эту технику, я иногда сокращал время запроса с часа до минуты или двух.

4 голосов
/ 30 января 2010

Я рискну предположить, что у вас есть ORDER BY или GROUP BY как часть вашего запроса.

Большинство механизмов баз данных, которые я использовал, все начинают передавать данные обратно клиенту, как только могут, даже если он еще не получил их все изнутри. Однако, как только вы добавите GROUP BY или ORDER BY в микс, движок не будет знать, как будет выглядеть первая строка, пока не будет получен весь набор данных на стороне сервера, поэтому вас ждут долгое время.

2 голосов
/ 30 января 2010

Извините, что добавил это как новый ответ, но кнопка "Добавить комментарий" по-прежнему не отображается:

@ Ласс,

Вопрос звучал для меня так, будто ОП интересовался «промежуточным знанием текущей стоимости, скажем, текущей суммы, которая вычисляется».

Этого нельзя сделать, точка.

Если бы вопрос ОП был скорее в направлении того, что вы указываете, а именно о получении «ранних подмножеств полного набора результатов», то я бы, конечно, предложил прибегнуть к методам запросов квот. Вы знаете, "ОПТИМИЗИРУЙТЕ НА 20 РЯДОВ" и тому подобное.

0 голосов
/ 30 января 2010

Возврат промежуточных результатов, пока «полный» запрос »все еще выполняется, противоречит духу того, как SQL и даже реляционная модель были изначально задуманы.

RM и даже SQL были возвращены, чтобы возвращать только полные и окончательные результаты после того, как они вычислены полностью и окончательно.

Если вы хотите получить статистически достоверные аппроксимации конечного результата, основанные на подмножестве населения, вы ДОЛЖНЫ БЫТЬ ИСПОЛЬЗОВАТЬСЯ К методам статистики и экстраполяции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...