tencent cloud

文档反馈

基本设置

最后更新时间:2023-12-12 14:36:44
    本文为您介绍列存索引 CSI 的相关操作。

    前提条件

    提交工单 申请升级小内核版本至 TDSQL-C MySQL 版8.0 3.2.1。
    说明:
    针对只读实例而言,符合版本要求的情况下,4核以上的只读实例才可以开启列存索引功能。

    开启或关闭 CSI

    1. 在集群列表页,根据实际使用的视图模式进行进入实例详情页。
    页签视图
    列表视图
    1. 登录 TDSQL-C MySQL 版控制台,在左侧集群列表,单击目标集群,进入集群管理页。
    2. 在集群详情下,找到目标实例,单击实例 ID 后的详情,进入实例详情页。
    
    
    1. 登录 TDSQL-C MySQL 版控制台,在集群列表,找到需要修改字符集的集群,单击集群 ID,进入集群管理页面。
    2. 在集群管理页面,选择实例列表页,找到要开启或关闭列存索引的读写实例或只读实例,单击实例 ID,进入实例详情页。
    
    
    2. 在实例详情页的实例形态后,单击修改图标。
    3. 在弹窗下,修改实例形态,单击确定即可。
    实例形态由行存调整为行列混存,表示开启列存索引 CSI。
    实例形态行列混存调整为行存,表示关闭列存索引 CSI。

    创建 CSI

    开启列存索引 CSI 后,建表相关的创建 CSI 命令如下:
    1. 创建表时创建 CSI
    CREATE TABLE table_name (col1, col2,... COLUMNSTORE INDEX [index_name] [(col1, col2,...)]);
    2. 创建表后创建 CSI
    CREATE COLUMNSTORE INDEX [index_name] [(col1, col2,...)] ON table_name;
    ALTER TABLE table_name ADD COLUMNSTORE INDEX [index_name] [(col1, col2,...)];

    删除 CSI

    开启列存索引 CSI 后,删除列存索引 CSI 的命令如下:
    ALTER TABLE table_name DROP INDEX index_name;

    重命名 CSI

    开启列存索引 CSI 后,重命名列存索引 CSI 的命令如下:
    ALTER TABLE table_name RENAME index old_index_name to new_index_name;

    列存索引 CSI HINT 语句

    1. 强制执行行存执行/列存执行。
    强制执行行存执行
    SELECT a FROM t IGNORE INDEX (csi);
    强制执行列存执行
    SELECT a FROM t FORCE INDEX (csi);
    2. 同时使用 HINT 执行并行查询与列存索引。
    SELECT /*+PARALLEL(2)*/ a FROM t FORCE INDEX (csi);

    创建表和列存索引示例

    CREATE TABLE t (a int, columnstore index csi (a));
    INSERT INTO t VALUES (0), (1), (2);
    SHOW CREATE TABLE t;
    SHOW INDEX FROM t;
    执行结果如下:
    MySQL [test]> CREATE TABLE t (a int, columnstore index csi (a));
    Query OK, 0 rows affected (0.01 sec)
    MySQL [test]> INSERT INTO t VALUES (0), (1), (2);
    Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0
    MySQL [test]> SHOW CREATE TABLE t;
    +-------+---------------------------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+---------------------------------------------------------------------------------------------------------------+
    | t | CREATE TABLE `t` ( `a` int DEFAULT NULL, COLUMNSTORE KEY `csi` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+---------------------------------------------------------------------------------------------------------------+
    MySQL [test]> SHOW INDEX FROM t;
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+-------------+---------+---------------+---------+------------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+-------------+---------+---------------+---------+------------+
    | t | 1 | csi | 1 | a | NULL | 1 | NULL | NULL | YES | COLUMNSTORE | | | YES | NULL |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+-------------+---------+---------------+---------+------------+
    1 row in set (0.00 sec)

    INDEX HINT 使用

    1. 强制语句使用列存索引。
    SELECT a FROM t FORCE INDEX (csi);
    EXPLAIN FORMAT=TREE SELECT a FROM t FORCE INDEX (csi);
    执行结果:
    MySQL [test]> SELECT a FROM t FORCE INDEX (csi);
    +------+
    | a |
    +------+
    | 0 |
    | 1 |
    | 2 |
    +------+
    3 rows in set (0.00 sec)
    MySQL [test]> EXPLAIN FORMAT=TREE SELECT a FROM t FORCE INDEX (csi);
    +---------------------------------------------------------------+
    | EXPLAIN |
    +---------------------------------------------------------------+
    | -> COLUMNSTORE Index scan on t using csi (cost=1.30 rows=3) |
    +---------------------------------------------------------------+
    1 row in set (0.00 sec)
    2. 强制语句不使用列存索引(行存执行)。
    SELECT a FROM t IGNORE INDEX (csi);
    EXPLAIN FORMAT=TREE SELECT a FROM t IGNORE INDEX (csi);
    执行结果:
    MySQL [test]> SELECT a FROM t IGNORE INDEX (csi);
    +------+
    | a |
    +------+
    | 0 |
    | 1 |
    | 2 |
    +------+
    3 rows in set (0.00 sec)
    MySQL [test]> EXPLAIN FORMAT=TREE SELECT a FROM t IGNORE INDEX (csi);
    +-----------------------------------------+
    | EXPLAIN |
    +-----------------------------------------+
    | -> Table scan on t (cost=0.55 rows=3) |
    +-----------------------------------------+
    1 row in set (0.00 sec)

    查看 CSI 索引创建情况

    show create table TABLE
    说明:
    默认不显示 COLUMNSTORE 前缀,需要指定开关 columnstore_display_in_show_create=1,才会显示。
    show index from TABLE
    explain format=tree
    说明:
    开启列 CSI 后,要查看 CSI 索引创建情况,也可通过 explain format=tree 查看执行计划算子是否有 COLUMNSTORE 前缀(有则表示算子采用了列式执行),来得知该算子是否使用列式执行。只有指定 format=tree 时,才显示 COLUMNSTORE 前缀,不指定格式则默认不显示 COLUMNSTORE。
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持