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

时间:2010-01-29 16:39:44

标签: sql mysql database select

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

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

感谢您的帮助。

4 个答案:

答案 0 :(得分:5)

最简单的尝试是使用无缓冲的查询。然后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

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

答案 1 :(得分:4)

我猜测你有ORDER BYGROUP BY作为查询的一部分。

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

答案 2 :(得分:2)

很抱歉将此添加为新答案,但“添加评论”按钮仍未显示:

@Lasse,

对我来说这个问题听起来像是OP对“中间知道正在计算的运行金额的当前值”感兴趣。

那是不可能的,期间。

如果OP的问题与您指示的方向相反,那就是获取“完整结果集的早期子集”,那么我的建议当然是采用配额查询技术。你知道,“优化20行”和那种东西。

答案 3 :(得分:0)

当“完整”查询“仍在进行中时,返回中间结果,违背了SQL,甚至关系模型最初构想的精神。

RM,甚至是SQL,只有在“完全 - 最后”计算后才会返回全部和最终结果。

如果您想获得基于人口子集的最终结果的统计上可靠的近似值,您必须重新计算统计和推断技术。