# Metric 引擎

> 介绍了 Metric 引擎的概念、架构及设计，重点描述了逻辑表与物理表的区别和批量 DDL 操作的实现。

# Metric 引擎

## 概述

`Metric` 引擎用于存储包含大量小型指标表的负载。

它将这些逻辑表映射到共享的物理宽表，使其复用列和元数据，从而降低每张表的存储开销并改善列式压缩。

## 概念

`Metric` 引擎引入了两个新的概念，分别是逻辑表与物理表。从用户视角看，逻辑表与普通表完全一样。从存储视角看，物理 Region 就是一个普通的 Region。

### 逻辑表
逻辑表，即用户定义的表。与普通的表都完全一样，逻辑表的定义包括表的名称、列的定义、索引的定义等。用户的查询、写入等操作都是基于逻辑表进行的。用户在使用过程中不需要关心逻辑表和普通表的区别。

逻辑表是虚拟表，本身不直接存储数据。Metric 引擎将其读写请求映射为对应物理表的请求。

### 物理表
物理表是真实存储数据的表，它拥有若干个由分区规则定义的物理 Region。

## 架构及设计

`Metric` 引擎的主要设计架构如下：

![多个逻辑表通过 Metric 引擎映射到由 Mito 管理的共享数据 Region 和元数据 Region。](/metric-engine-architecture.zh.svg)

`Metric` 引擎将物理存储和查询交给 `Mito` 引擎。每个物理 Region 组包含一个数据 Region 和一个元数据 Region：数据 Region 保存映射到该 Region 组的逻辑表数据，元数据 Region 保存逻辑表及逻辑列的映射。

关联到同一物理表的逻辑表使用相同的分区布局。写入时，Metric 引擎为每行数据记录逻辑表身份；读取时，它在扫描物理 Region 前增加逻辑表过滤条件。

逻辑表的路由只保存所属物理表的 ID，再由物理表路由解析出持有 Region 的 Datanode。逻辑路由本身不记录 peer，因此迁移物理 Region 只需改写一条物理路由，而不必改写映射到它的每一条逻辑路由。

逻辑表支持普通的 INSERT、DELETE 和 SELECT 操作。直接写入物理 Region 会绕过逻辑表映射，因此会被拒绝；物理表仍然可以查询。

批量 DDL 用于减少大量逻辑表同时创建或更新时的元数据操作，例如 Prometheus Remote Write 自动建表或物理 Region 迁移。
