我们在mysql数据库上发出一些长时间运行的查询。 (上下文是离线数据分析,而不是应用程序。)我们将如何进行研究,取决于我们在此过程中获得的结果。在查询完成之前,能够通过SELECT语句查看(部分)结果将非常有用。
这可能吗?或者我们是否一直等到查询完成(给定数据集的大小可能需要几个小时)才能查看在运行的最初几秒内生成的结果?
感谢您的帮助。
答案 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 BY
或GROUP BY
作为查询的一部分。
我使用过的大多数数据库引擎都会尽快将数据流回客户端,即使它还没有在内部获取它们。但是,一旦你将GROUP BY
或ORDER BY
投入混合,引擎就不会知道第一行的样子,直到它产生整个数据集服务器端,这就是为什么你'等待了很长时间。
答案 2 :(得分:2)
很抱歉将此添加为新答案,但“添加评论”按钮仍未显示:
@Lasse,
对我来说这个问题听起来像是OP对“中间知道正在计算的运行金额的当前值”感兴趣。
那是不可能的,期间。
如果OP的问题与您指示的方向相反,那就是获取“完整结果集的早期子集”,那么我的建议当然是采用配额查询技术。你知道,“优化20行”和那种东西。
答案 3 :(得分:0)
当“完整”查询“仍在进行中时,返回中间结果,违背了SQL,甚至关系模型最初构想的精神。
RM,甚至是SQL,只有在“完全 - 最后”计算后才会返回全部和最终结果。
如果您想获得基于人口子集的最终结果的统计上可靠的近似值,您必须重新计算统计和推断技术。