查看列存索引构建的执行进度

本文介绍当操作大表或遇到执行时间较长的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表中查看。

    • PolarDB MySQL版企业版的集群版本为8.0.1.1.34及以下或8.0.2.2.15及以下时,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
    • PolarDB MySQL版企业版的集群版本为8.0.1.1.35及以上或8.0.2.2.16及以上时,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` varchar(128) NOT NULL DEFAULT '',    -- 已扫描行数及百分比,实际行数可大于预估行数
        `SCAN_SECOND` bigint(8) NOT NULL DEFAULT '0',       -- 扫描已执行秒数
        `SORT_ROUNDS` bigint(8) NOT NULL DEFAULT '0',       -- 排序轮次,仅适用于带排序键场景
        `SORT_SECOND` bigint(8) NOT NULL DEFAULT '0',       -- 排序已执行秒数,仅适用于带排序键场景
        `BUILD_ROWS` varchar(128) NOT NULL DEFAULT '',      -- 排序结束写入行数及百分比,仅适用于带排序键场景
        `BUILD_SECOND` 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的情况。

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官网