长时间运行的SELECT查询的部分结果?

lar*_*els 2 mysql sql database select

我们在mysql数据库上发出一些长时间运行的查询.(上下文是离线数据分析,而不是应用程序.)我们将如何进行研究,取决于我们在此过程中获得的结果.在查询完成之前,能够查看(部分)SELECT语句生成的结果将非常有用.

这可能吗?或者我们是否一直等到查询完成(给定数据集的大小可能需要几个小时)才能查看在运行的最初几秒内生成的结果?

感谢您的任何帮助.

ang*_*son 5

我将冒险猜测您拥有ORDER BYGROUP BY作为您查询的一部分。

我使用过的大多数数据库引擎都会尽快将数据流式传输回客户端,即使它尚未在内部全部获取它们。但是,一旦您投入GROUP BYORDER BY混合,引擎不知道第一行会是什么样子,直到它在服务器端生成整个数据集,这就是为什么您要等待很长时间。


Bre*_*ley 5

最简单的尝试是使用无缓冲的查询.然后mysql将尽快开始传递数据,而不是在它准备好(和缓冲)时.根据您的查询,这可能没有帮助.

要真正加快速度,您需要打破查询.不仅仅使用LIMIT,根据您的查询,这不会为您节省很多时间.例如,如果您有ORDER BY,则必须首先计算整个结果集.您只需节省通过网络传输更少数据所需的时间.

通过过滤来拆分您的查询.如果您有一个索引字段,您可以进行范围搜索(即自动增量),然后使用该字段将查询分解为多个查询.例如:

SELECT * FROM db WHERE field1 BETWEEN 1 AND 10000;
SELECT * FROM db WHERE field1 BETWEEN 10000 AND 20000;
...
Run Code Online (Sandbox Code Playgroud)

然后您可以在以后合并结果.很多时候,像这样的多个查询比同等的单个查询完成得更快.但是如果你有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
Run Code Online (Sandbox Code Playgroud)

分而治之.使用这种技术,我有时会将查询时间从一小时减少到一两分钟.