估计 MySQL 查询运行时间

估计 MySQL 查询运行时间

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

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

该查询非常广泛(5000 行),并且对 150 个表中的 90,000,000 行进行了复杂搜索。

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

有什么方法可以对正在运行的查询运行状态检查吗?

答案1

好吧,您可以登录 mysql 控制台并发出命令SHOW PROCESSLIST;。这将显示正在运行的查询,但您无法获得这些查询何时结束的估计值。

如果您事先使用前缀运行查询EXPLAIN EXTENDED,这将显示基数以及有关查询的其他相关详细信息。这可能会对您有所帮助,但由于查询正在运行,您可以使用另一种方法,详细说明如下mysql性能博客

摘抄:

答案很简单,因为服务器上没有其他程序在运行。这意味着 SHOW GLOBAL STATUS 大致说明了查询实际在做什么。(如果服务器上有很多活动,我就不能自信地说 SHOW GLOBAL STATUS 显示了该查询在做什么;其他查询的活动也会混杂在其中。如果能够选择另一个线程并只查看其状态就好了,但 MySQL 目前不允许您这样做。)

解决方案是测量查询在事实表的表扫描中扫描行的速度。这由 Handler_read_rnd_next 状态变量显示。这是一种简单的观察方法(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 分钟内完成。

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

答案2

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

我可以强调的其他选择:

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

相关内容