Mysql SQL查看查询的进度

Mysql SQL查看查询的进度,mysql,sql,progress,Mysql,Sql,Progress,有没有办法查看查询的进度?例如,选择必须获取大量数据的查询。如果一个表包含100行,SQL能否报告当前正在处理的行?这将是1比100的进步 我不想查看剩余时间的进度或与时间相关的内容,因为我发现这不可能或我错了?您可以尝试显示进程列表在mysql中,它将为您提供查询所花费的时间,以及当前的步骤查询,如获取、发送等。据我所知,SQL查询不是这样工作的。您可以查看有效期或执行时间/日期,然后评估开始和完成之间的差异,或者将查询拆分,查看它如何影响所用的总时间 我只是不认为SQL以这种方式报告,所以“

有没有办法查看查询的进度?例如,选择必须获取大量数据的查询。如果一个表包含100行,SQL能否报告当前正在处理的行?这将是1比100的进步


我不想查看剩余时间的进度或与时间相关的内容,因为我发现这不可能或我错了?

您可以尝试
显示进程列表
在mysql中,它将为您提供查询所花费的时间,以及当前的步骤查询,如获取、发送等。

据我所知,SQL查询不是这样工作的。您可以查看有效期或执行时间/日期,然后评估开始和完成之间的差异,或者将查询拆分,查看它如何影响所用的总时间


我只是不认为SQL以这种方式报告,所以“加载”的想法有点远。虽然我只使用了一些SQL技术…

但您最好在运行查询之前分析数据。

这是可能的

顺便说一句,请注意,例如,用于MySQL和MariaDB的CLI中的mytop监视工具已经实现了该功能

(1)在马里亚行

SHOW FULL PROCESSLIST;
+-----+------+-----------+------+---------+------+-------+-----------------------+----------+
| Id  | User | Host      | db   | Command | Time | State | Info                  | Progress |
+-----+------+-----------+------+---------+------+-------+-----------------------+----------+
| 126 | root | localhost | NULL | Query   |    0 | NULL  | SHOW FULL PROCESSLIST |    0.000 |
+-----+------+-----------+------+---------+------+-------+-----------------------+----------+
进展: 流程的总进度(0-100%)(如何启用?请参阅MariaDB手册的第页)

此功能是从MariaDB 5.3引入的

(2)在MySQL中

查询属性的默认列表为,例如:

Id: 3123
User: stefan
Host: localhost
db: apollon
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
如果您想在InnoDB
中监视例如
ALTER TABLE
命令进度,您可以使用:

SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;
这将产生类似的结果:

+------------------------------------------------------+----------------+----------------+
| EVENT_NAME                                           | WORK_COMPLETED | WORK_ESTIMATED |
+------------------------------------------------------+----------------+----------------+
| stage/innodb/alter table (read PK and internal sort) |            280 |           1245 |
+------------------------------------------------------+----------------+----------------+
但首先必须启用此机制:

UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';

UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
当然,您必须已经启用了性能模式

描述了整个过程

哎哟!我忘记了这个重要的链接:,从MySQL 5.7.9开始,有几个插件可用

如何在cfg文件中启用:

[mysqld]
performance-schema-instrument='stage/%=ON'
performance-schema-consumer-events-stages-current=ON
performance-schema-consumer-events-stages-history=ON
performance-schema-consumer-events-stages-history-long=ON
如何检查流程监控工具的当前状态:

SELECT * FROM setup_instruments WHERE NAME RLIKE 'stage/sql/[a-c]';
SELECT * FROM setup_instruments WHERE
       ENABLED='YES' AND NAME LIKE "stage/%";
SELECT * FROM setup_consumers WHERE NAME LIKE '%stages%';
注: 如果你得到了错误

ERROR 1227 (42000): Access denied; you need the PROCESS privilege for this operation

那么您可能是以匿名用户的身份连接的。尝试运行“选择当前用户”查看。

您使用的是哪种DBMS?博士后?Oracle?@a_horse_和_no_name这是一个一般的DBMS问题,但更准确地说,是MySQL。我认为,由于DBMS加载数据(执行计划等)的方式,很难确定您的位置,尤其是如果您不确定首先返回多少行。再加上执行计划的复杂性,以及多线程上的并行性,您就有了“悬而未决”的最佳猜测。在大多数情况下,如果一个查询需要足够长的时间来保证一个进度条,那么它可能写得不太好(尽管这取决于它应该做什么!)@Charleh:在Oracle(企业版)中,可以监视正在运行的语句。Oracle甚至会显示执行计划中的每一步有多远。啊,太酷了,不知道MSSQLSwell中是否有类似的东西,Oracle可以显示语句的进度,甚至执行计划中的每一步都以百分比表示。Dang,我还没有使用过的一个例子:(