You need to enable JavaScript to run this app.
导航
HTAP 语法说明
最近更新时间:2024.08.22 10:30:22首次发布时间:2024.08.22 10:30:22

本文主要介绍使用 HTAP 功能常用的 SQL 语句。

创建 HTAP 表

使用限制

  • 目前支持开启 HTAP 能力的表必须包含主键(Primary Key),且仅支持对整表创建列存。

  • 对 HTAP 做 DDL 变更时,需要执行 SECONDARY_UNLOAD 卸载列存后,再执行 DDL 变更。执行 DDL 完成后,再执行 SECONDARY_LOAD 加载列存。

使用说明

说明

创建 HTAP 表时,需要通过读写终端(如主节点终端或默认终端)进行连接, 且账号需要拥有 CREATE 权限。

veDB MySQL 通过指定 SECONDARY_ENGINE = HTAP 为目标表开启 HTAP 功能。同时通过 SECONDARY_ENGINE_ATTRIBUTE = 'JSON string' 方式定义 HTAP 表的 AP 属性,比如分区列、分区数目等。示例如下:

  • 创建新一个表。

    CREATE TABLE table_name (...)
    SECONDARY_ENGINE=HTAP
    SECONDARY_ENGINE_ATTRIBUTE='JSON string'
    ;
    
  • 通过 ALTER TABLE 为存量 TP 表附上 HTAP 属性。

    ALTER TABLE table_name
    SECONDARY_ENGINE=HTAP
    SECONDARY_ENGINE_ATTRIBUTE='JSON string'
    ;
    

SECONDARY_ENGINE_ATTRIBUTE 中的属性均为选填,包括表属性和列字段属性:

类型说明

表属性

当前,支持的 HTAP 表属性如下:

  • DISTRIBUTION_KEYS:数据分布列名,可为多列;如果不填写,则默认为 InnoDB 主键。主键不支持以下类型:
    • BIT[(M)]
    • BOOL, BOOLEAN
    • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
    • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    • ENUM('value1', value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
    • SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
    • Spatial
    • JSON
  • DISTRIBUTION_NUMBER:数据分布数目;如果不填写,则默认为 11。
SECONDARY_ENGINE_ATTRIBUTE = '{
    "DISTRIBUTION_KEYS": ["COL1", "COL2"],
    "DISTRIBUTION_NUMBER":20
    }'

列字段属性

支持的 HTAP 列字段属性如下:

  • INC_STATS:需要从 AP 侧收集的统计信息。示例如下:
    CREATE TABLE table_name (
        ...
        col1 VARCHAR(64) SECONDARY_ENGINE_ATTRIBUTE = '{"INC_STATS": true}',
        ...
    )
    SECONDARY_ENGINE=HTAP
    ;
    

加载/卸载 HTAP 表

说明

加载或卸载 HTAP 表,需要通过读写终端(如主节点终端或默认终端)进行连接,且账号需要拥有目标表的 DDL 权限。

对于已经指定 SECONDARY_ENGINE 为 HTAP 的表,通过如下方式进行表加载:

ALTER TABLE table_name SECONDARY_LOAD;

加载后,该表自动捕获 TP 数据变更,同时保持 TP 和 AP 的数据一致性。
也可通过如下语法,卸载 HTAP 表,此时该表只会保留一份 TP 数据:

ALTER TABLE table_name SECONDARY_UNLOAD;

查询执行

说明

执行分析查询语句,需要使用 HTAP 集群终端进行连接。

目前,veDB MySQL HTAP 版本,查询语法完全兼容 MySQL,可以通过设置 use_secondary_engine 变量让请求强制走 AP 或者 TP,使用方式如下:

  • 该变量可以为会话变量,通过 SET @@use_secondary_engine 指定。取值如下:

    • ON:内核自动分流。

    • OFF:强制走TP。

    • FORCED:强制走 AP。

  • 该变量可以为 HINT 变量,通过语句指定。

-- 开启自动TP/AP 分流, SESSION有效
SET @@use_secondry_engine="ON";

-- 强制走AP引擎
SET @@use_secondary_engine="FORCED";

-- 强制走TP引擎
SET @@use_secondary_engine="OFF";

-- 查询采用Hint指定
SELECT /*+ set_var(use_secondary_engine=forced) */ CHAR(N_NATIONKEY) FROM NATION;

TP/AP 自动分流

说明

执行分析查询语句,需要使用 HTAP 集群终端进行连接。

use_secondary_engine = ON 的时候,内核开启自动分流,TP 和 AP 的自动分流采用三个维度:

  • 基于查询 Cost 的分流 ,通过 secondary_engine_cost_threshold 进行变量控制。

    -- 查询当前的分流Cost阈值
    SELECT @@secondary_engine_cost_threshold;
    
    -- 设置语句级别的Cost阈值
    SELECT /*+ set_var(secondary_engine_cost_threshold=100) */ CHAR(N_NATIONKEY) FROM NATION;
    
  • 基于数据新鲜度的分流,即该查询会尝试等待一定时间后,检查 AP 的列存数据生成是否已经达到 TP 的数据位点;若追上了 TP 数据,则将查询分发到 AP,通过 htap_consistency_read_timeout 进行控制。

    -- 查询数据新鲜度的等待时延(millisecond)
    SELECT @@htap_consistency_read_timeout;
    
    -- 设置数据新鲜度的等待时延(millisecond)
    SET GLOBAL htap_consistency_read_timeout = 5000;
    
    -- 设置语句级别的会话一致性等待时间
    SELECT /*+ set_var(htap_consistency_read_timeout=500) */ CHAR(N_NATIONKEY) FROM NATION;
    
  • 基于 AP 兼容性的分流

    目前,HTAP 对已支持的 MySQL 数据类型、函数进行分发,确保整系统的查询结果一致。