有没有办法可以查看查询的进度?例如,SELECT查询必须获取大量数据。如果一个表包含100行,那么SQL可以报告当前正在处理的行吗?这将是1到100的进展。
我不想查看剩余时间的进度或与时间有关的事情,因为我发现它不可能或我错了?。
答案 0 :(得分:3)
您可以在mysql中尝试show processlist;
,它会为您提供查询所需的时间以及当前步骤查询的提取,发送等。
答案 1 :(得分:1)
有可能!
请注意,例如mytop-来自MySQL和MariaDB的CLI监视工具已经实现了该功能。
(1)在MariaDB中
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%)(如何启用它?请参见Progress Reporting-MariaDB手册页)。
此功能是从 MariaDB 5.3 中引入的。
(2)in MySQL
查询属性的默认列表例如:
Id: 3123
User: stefan
Host: localhost
db: apollon
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
如果您想监视例如在{strong> 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%';
,当然,您必须已经启用 performance_schema 。
here中描述了整个过程。
太好了!我忘记了这个重要的链接:https://dev.mysql.com/doc/refman/5.7/en/sys-schema-progress-reporting.html,从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
那么您可能已以匿名用户身份连接。尝试运行“选择current_user”进行查看。
答案 2 :(得分:0)
据我所知,SQL查询无法正常工作。您可以查看重要的期间或执行时间/日期,然后评估开始和结束之间的差异,或者可以拆分查询,看看它如何影响所花费的总时间。
我只是不认为SQL会以这种方式报告,所以“加载”的想法有点远远看。虽然我只使用了一些SQL技术......