基本设置

最近更新时间:2024-07-18 14:06:01

我的收藏
本文为您介绍列存索引 CSI 的相关操作。

前提条件

内核版本为 TDSQL-C MySQL 版8.0 3.1.14及以上。
说明:
针对只读实例而言,符合版本要求的情况下,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] ON table_name[(col1, col2,...)];
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。