本文档我们介绍 Doris 怎么创建表及其他的相关操作。
连接 Doris
我们在成功部署完成 Doris 之后,我们可以通过任意 MySQL 客户端来连接 Doris ,下面我们的示例是通过 MySQL 客户端命令行工具来进行操作。
注意:
这里连接 Doris ,指的是连接 Doris FE,
连接的 IP 地址就是 FE 节点 IP 地址,端口是 FE 的
query_port
默认是9030
mysql -u<username> -P<query_port> -h<FE_IP>
创建数据库
这里我们使用 root 用户登录,创建一个 test_doris 的数据库
mysql -uroot -P9030 -h127.0.0.1 create database test_doris;
创建成功之后你可以通过 SHOW DATABASES
命令来查看创建好的数据库,这个命令会显示所有已经创建的数据库
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | demo | | information_schema | | test_doris | +--------------------+ 3 rows in set (0.00 sec)
创建表
我们下面来在新创建的数据库中创建一张表
Doris 提供了多种 数据模型,来满足不同用户场景的使用,下面我们以 明细模型 为例创建 Doris 的表,
建表语法及更多参数请参 SQL手册 CREATE TABLE
CREATE TABLE IF NOT EXISTS test_doris.example_tbl ( `timestamp` DATE NOT NULL COMMENT "['0000-01-01', '9999-12-31']", `type` TINYINT NOT NULL COMMENT "[-128, 127]", `error_code` INT COMMENT "[-2147483648, 2147483647]", `error_msg` VARCHAR(300) COMMENT "[1-65533]", `op_id` BIGINT COMMENT "[-9223372036854775808, 9223372036854775807]", `op_time` DATETIME COMMENT "['0000-01-01 00:00:00', '9999-12-31 23:59:59']", `target` float COMMENT "4 字节", `source` double COMMENT "8 字节", `lost_cost` decimal(12,2) COMMENT "", `remark` string COMMENT "1m size", `op_userid` LARGEINT COMMENT "[-2^127 + 1 ~ 2^127 - 1]", `plate` SMALLINT COMMENT "[-32768, 32767]", `iscompleted` boolean COMMENT "true 或者 false" ) DUPLICATE KEY(`timestamp`, `type`) DISTRIBUTED BY HASH(`type`) BUCKETS 1 PROPERTIES ( "replication_allocation" = "tag.location.default: 1" );
注意:
- 1.Doris 对字段名称是不区分大小写的,对表名是区分大小写的,如果你想忽略大小写,请参照 Doris变量配置 中的
lower_case_table_names
说明。 - 2.DISTRIBUTED BY 这个是必选项,而且分桶字段必须在 key 里定义
建表语句说明
- 1.字段类型:Doris 提供了丰富的数据类型,上面例子里我们列出了一部分,Doris 还支持 BITMAP, HLL, ARRAY(1.2版本发布)等,具体可以查看 SQL 手册 -> 数据类型 部分
注意:
- 2.我们在建表的时候,尽可能精准的选择数据类型,能使用数字类型的不要使用字符串类型,满足业务需求即可
- 3.比如能使 INT 类型的不要是 BIGINT ,能使用 varchar 类型的不要是 String 类型等,这样更能发挥数据库的性能,
- 4.排序 Key :Doris 内部的存储是按照我们建表时指定的 Key 进行排序的,就是我们在建表时指定的
DUPLICATE KEY()
,AGGREGATE KEY()
,UNIQUE KEY()
中指定的字段,比如上面的建表语句排序 Key 就是我们指定的timestamp
和type
两列。
注意:- 5.我们在建表的排序 Key 必须在表的其他列前面,这块详细的内容请参考 前缀索引
- 6.DISTRIBUTED BY 这里给的字段必须在排序 Key 中定义,否则创建表的时候会失败
- 7.分区分桶
Doris 表支持 创建分区表,你可以通过 PARTITION 关键字来给表创建分区,分区字段类型支持时间类型(DATE 、DATETIME)及 数字类型,同时你可以创建 动态分区表,动态分区表的字段类型只能是时间类型,动态分区粒度支持小时、天、周、月。
分桶是通过 DISTRIBUTED 关键字类指定,这个字段必须是在排序 Key 中定义的字段
分区和分桶的关系:分区和分桶你可以理解成一二级索引,分桶是在分区下面的二级索引
我们在创建表的时候选择合适的分区及分桶策略对我们的查询分析性能提升非常大的帮助,有关如何选择分区分桶可以参照 数据划分。- 8.数据模型
DUPLICATE 关键字指定了这个表的数据模型是明细模型, Key 后面给的列表示当前表的排序 Key,Doris 支持一下三种数据模型
你可以根据三种数据模型的特点结合自己业务的情况进行选择使用。
- 1.数据索引
Doris 默认会给我们在建表的时候指定的排序 Key 创建稀疏索引来加速数据查询,同时 Doris 支持 BITMAP索引 ,BloomFilter索引 ,同时 Doris 内部也之内一些智能索引。- 2.ENGINE 类型
Doris 支持多用 ENGINE 类型,默认是 OLAP(Doris内部表),同时我们还支持odbc
、hudi
、hive
、iceberg
、elasticsearch
等,这些都是表示创建的是对应的外部表,具体这块我们可以去查看 生态扩展 -> 扩展表 部分的内容。
查看表信息
我们执行完建表语句,表创建成功之后,我们可以通过下面的命令来查看表的相关信息
查看当前数据库下的所有表信息
SHOW TABLES
mysql> show tables; +----------------------+ | Tables_in_test_doris | +----------------------+ | expamle_tbl | +----------------------+ 1 row in set (0.00 sec)
查看表结构
DESC table_name [ALL]
mysql> desc expamle_tbl all; +-------------+---------------+-------------+---------------+------+-------+---------+-------+---------+ | IndexName | IndexKeysType | Field | Type | Null | Key | Default | Extra | Visible | +-------------+---------------+-------------+---------------+------+-------+---------+-------+---------+ | expamle_tbl | DUP_KEYS | timestamp | DATETIME | No | true | NULL | | true | | | | type | TINYINT | No | true | NULL | | true | | | | error_code | INT | Yes | false | NULL | NONE | true | | | | error_msg | VARCHAR(300) | Yes | false | NULL | NONE | true | | | | op_id | BIGINT | Yes | false | NULL | NONE | true | | | | op_time | DATE | Yes | false | NULL | NONE | true | | | | target | FLOAT | Yes | false | NULL | NONE | true | | | | source | DOUBLE | Yes | false | NULL | NONE | true | | | | lost_cost | DECIMAL(12,2) | Yes | false | NULL | NONE | true | | | | remark | TEXT | Yes | false | NULL | NONE | true | | | | op_userid | LARGEINT | Yes | false | NULL | NONE | true | | | | iscompleted | BOOLEAN | Yes | false | NULL | NONE | true | +-------------+---------------+-------------+---------------+------+-------+---------+-------+---------+ 12 rows in set (0.01 sec)
查看建表语句
SHOW CREATE TABLE TABLE_NAME
show create table expamle_tbl;
修改表结构
Doris 支持多种 DDL 操作,你可以通过 ALTER TABLE 命令来修改表的 Schema ,包括增加列,修改列类型、删除列、改变列的顺序。
注意:
目前 Doris 不支持修改列名
增加一列
ALTER TABLE expamle_tbl ADD COLUMN TEST_ADD_COL INT DEFAULT '0' AFTER iscompleted;
添加成功之后我们通过 desc 命令可以看到我们新加的列
mysql> desc expamle_tbl; +--------------+---------------+------+-------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------+------+-------+---------+-------+ | timestamp | DATETIME | No | true | NULL | | | type | TINYINT | No | true | NULL | | | error_code | INT | Yes | false | NULL | NONE | | error_msg | VARCHAR(300) | Yes | false | NULL | NONE | | op_id | BIGINT | Yes | false | NULL | NONE | | op_time | DATE | Yes | false | NULL | NONE | | target | FLOAT | Yes | false | NULL | NONE | | source | DOUBLE | Yes | false | NULL | NONE | | lost_cost | DECIMAL(12,2) | Yes | false | NULL | NONE | | remark | TEXT | Yes | false | NULL | NONE | | op_userid | LARGEINT | Yes | false | NULL | NONE | | iscompleted | BOOLEAN | Yes | false | NULL | NONE | | TEST_ADD_COL | INT | Yes | false | 0 | NONE | +--------------+---------------+------+-------+---------+-------+ 13 rows in set (0.01 sec)
删除一列
我们来删除上面新增的那一列数据
ALTER TABLE expamle_tbl DROP COLUMN TEST_ADD_COL;
查看 Schema Chanage 作业状态
我们可以通过 SHOW ALTER TABLE COLUMN\G;
来看到表结构变更作业的状态信息。
State 是 FINISHED 表示作业完成,新的表结构已经生效。
mysql> SHOW ALTER TABLE COLUMN\G; *************************** 1\. row *************************** JobId: 12015 TableName: expamle_tbl CreateTime: 2022-08-18 14:54:26 FinishTime: 2022-08-18 14:54:27 IndexName: expamle_tbl IndexId: 12016 OriginIndexId: 12012 SchemaVersion: 1:1978370804 TransactionId: 2003 State: FINISHED Msg: Progress: NULL Timeout: 86400 1 row in set (0.01 sec)
这个时候就可以通过 DESC TABLE_NAME
来查看变更后的表结构了
取消 Schema Chanage 作业
如果作业长时间没有完成,或者影响到了其他操作,你可以通过下面的命令来取消作业。
具体更多使用请参照 CANCEL ALTER TABLE 。
CANEL ALTER TABLE COLUMN FROM expamle_tbl