查看DDL执行速度和进度

本文介绍当操作大表或遇到执行时间较长的DDL语句时,如何在列存索引(IMCI)和InnoDB两种场景下查看DDL语句的执行速度和构建进度。

列存索引(IMCI)场景

您可以在对应的表中查看您需要的信息:

  • INFORMATION_SCHEMA.IMCI_INDEXES表中查看索引的状态信息;

  • INFORMATION_SCHEMA.IMCI_INDEX_STATS表中查看索引的写入速度;

  • INFORMATION_SCHEMA.IMCI_ASYNC_DDL_STATS表中查看列存索引从行存恢复数据或者通过异步DDL构建列存索引数据的过程,主要用于查看构建中的执行速度和任务进度。已完成数据构建的任务会在完成构建后的5~10分钟后被清理掉,如果需要查看完整的索引状态信息,您可以在INFORMATION_SCHEMA.IMCI_INDEXES表中查看。INFORMATION_SCHEMA.IMCI_ASYNC_DDL_STATS表结构如下:

CREATE TABLE: CREATE TEMPORARY TABLE `IMCI_ASYNC_DDL_STATS` (
  `SCHEMA_NAME` varchar(193) NOT NULL DEFAULT '',     -- 库名
  `TABLE_NAME` varchar(193) NOT NULL DEFAULT '',      -- 表名
  `CREATED_AT` varchar(64) NOT NULL DEFAULT '',       -- 任务创建时间戳
  `STARTED_AT` varchar(64) NOT NULL DEFAULT '',       -- 任务开始执行时间戳
  `FINISHED_AT` varchar(64) NOT NULL DEFAULT '',      -- 任务开始结束时间戳
  `STATUS` varchar(128) NOT NULL DEFAULT '',          -- 状态
  `APPROXIMATE_ROWS` bigint(8) NOT NULL DEFAULT '0',  -- 预估基线数据行数
  `SCANNED_ROWS` bigint(8) NOT NULL DEFAULT '0',      -- 已扫描行数,实际行数可大于预估行数
  `AVG_SPEED` int(4) NOT NULL DEFAULT '0',            -- 任务开始后的平均速度,单位行每秒
  `SPEED_LAST_SECOND` int(4) NOT NULL DEFAULT '0',    -- 前一秒速度,单位行每秒
  `ESTIMATE_SECOND` bigint(8) NOT NULL DEFAULT '0'    -- 预计剩余时间,单位秒
) ENGINE=MEMORY DEFAULT CHARSET=utf8

其中,前一秒速度SPEED_LAST_SECOND容易受到系统资源以及任务并发程度影响,可能存在一定的波动。预计剩余时间ESTIMATE_SECOND根据剩余行数除以前一秒速度后评估而来,可能存在一定的波动。如果触发写入限速,那么前一秒的速度的值可能会为0,从而出现ESTIMATE_SECOND取值为9223372036854775807的情况。

查看INFORMATION_SCHEMA.IMCI_ASYNC_DDL_STATS表中的DDL的执行速度和进度信息,示例如下:

image

InnoDB场景

使用Online DDL添加列存索引或构建索引的过程中,AP节点的主要任务是回放Redo日志并将数据写入列存索引,主要受限于日志回放速度和主节点DDL执行速度,日志回放速度可以参考控制台的性能监控信息,主节点DDL的执行速度参考InnoDB DDL监控信息。

InnoDB DDL监控信息依赖于Performance Schema模块,您可以在events_stages_current表中查询正在执行的DDL语句, 在events_stages_history表中查询已执行结束的DDL语句,主要的监控指标为WORK_COMPLETEDWORK_ESTIMATED,单位为Page。详情可参考MySQL官网

阿里云首页 云原生关系型数据库 PolarDB 相关技术圈