估计MySQL查询运行时

我使用以下命令从命令行运行MySQL查询

nohup mysql --user=root --password=XXXXXXXXX database < report.sql > results.tab 

此查询是广泛的(5000行),并从150个表中运行超过90,000,000行的复杂search。

此查询已运行超过24小时,尚未完成。

有没有办法可以运行状态检查这个正在运行的查询?

那么,你可以login到一个MySQL控制台,并发出SHOW PROCESSLIST; 命令。 这会告诉你什么查询正在运行,但你不会得到估计,这些查询何时结束。

如果事先使用EXPLAIN EXTENDED前缀运行查询,则会显示有关查询的基数和其他相关详细信息。 这可以帮助你,但是由于查询正在运行,你可以使用另一种方法,在mysqlperformanceblog中详细解释。

摘抄:

答案很简单,因为服务器上没有别的东西在运行。 这意味着SHOW GLOBAL STATUS给了查询实际上做了什么粗略的想法。 (如果服务器上有很多活动,我就不能有把握地说,SHOW GLOBAL STATUS显示了一个查询正在做什么;其他查询的活动也会混在那里。很高兴能够select另一个线程,只看它的状态,但MySQL目前不让你这样做。)

解决scheme是测量查询在事实表的表扫描中扫描行的速度。 这由Handler_read_rnd_next状态variables显示。 这是一个简单的方法来观看它(innotop是另一个方便的方法):

 mysqladmin extended -r -i 10 | grep Handler_read_rnd_next -- ignore the first line of output... | Handler_read_rnd_next | 429224 | 

所以服务器每秒钟读取大约43K行,表中有1.5亿行。 稍后再计算一下,你就可以完成3488秒,或者不到一个小时。 事实上,查询在大约55分钟内完成。

这是最简单的情况,还有更复杂的情况需要考虑,但希望这可以让你知道如何在不同的情况下解决这个问题。

估计正在运行的查询的进度似乎并不是一件容易的事情。 你可以看看这个post 。

其他选项我可以强调:

  1. 您可以使用像top这样的系统工具来确保它仍在运行(消耗CPU)。
  2. 如果可能的话,build议您将复杂查询划分为多个查询。 在这种情况下,您可以简单地编写脚本来执行多个查询,并在每两次连续执行之间回显一些信息。 这样你可以知道工作进展。