Skip to content

Commit

Permalink
Merge pull request #50 from kuang17/patch-1
Browse files Browse the repository at this point in the history
Update 03-basic-use.md
  • Loading branch information
bartdong authored Sep 19, 2024
2 parents 5f5c701 + 4d5ecaa commit b166bc5
Showing 1 changed file with 50 additions and 2 deletions.
52 changes: 50 additions & 2 deletions docs/guide/03-basic-use.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
>本篇将介绍OpenTenBase中特有的shard表、复制表的创建,和基本的DML操作。
## 1、创建数据表
### 1.1、创建shard普通表
### 1.1、创建shard普通表(分片表)
![OpenTenBase_shard普通表](images/1.1shard.jpg)
![OpenTenBase_shard普通表续](images/1.1shard_2.jpg)
![OpenTenBase_shard普通表说明](images/1.1shard_3.jpg)
Expand All @@ -16,8 +16,25 @@
- distribute by shard(x) 用于指定分布键,数据分布于那个节点就是根据这个字段值来计算分片。
- to group xxx 用于指定存储组(每个存储组可以有多个节点)。
- 分布键字段值不能修改,字段长度不能修改,字段类型不能修改。

分布式数据库中,分片表是使用最多的表类型,合理的分片键设置将会系统的性能提升很多倍,不合理的分片键也会导致SQL性能恶化严重,因此分片键的优化是分布式SQL优化的重点中的重点:
分片键选择准则:
* 准则1:高频类SQL的业务字段,避免SQL产生分布式事务,避免跨DN节点数据插入、更新、删除(SQL能带上分片键)。
* 准则2:分析类SQL的关联字段,尽量避免SQL产生批量跨DN节点数据交互(关联字段为分片键)。
* 准则3:尽量避免DN节点数据不均衡。
准则1、2和准则3可能有冲突,选择时准则1高于准则2、3

数据库在迁移时,会使用默认的规则指定分片键,大部分情况下是最优的,但仍有部分情景需要调整,下面是默认原则:
1)有主键,则选择主键做分片键。如果主键是复合字段组合,则选择第一个字段做分片键。
2)有唯一索引,则选择唯一索引列做分片键。如果唯一索引是复合字段组合,则选择第一个字段做分片键。
3)使用第一个字段做分片键。

一般会有两个阶段调整表类型和分片键:
阶段一:迁移之前,针对TOP 20的大表或者常用表确定表的类型和分片键,在迁移完表结构后,进行调整,之后再导入数据。
阶段二:在适配测试、性能测试阶段,针对有性能问题的业务再进行调优。


### 1.2、创建shard普通分区表
### 1.2、创建shard普通分区表(分片表+分区)
![OpenTenBase_shard分区表](images/1.2shard_part.jpg)
![OpenTenBase_shard分区表续](images/1.2shard_part_2.jpg)

Expand Down Expand Up @@ -95,6 +112,37 @@ CREATE TABLE
- 复制表是所有节点都有全量数据,对于大数据量的数据表不适合。
- 复制表更新性能较低。

### 1.4、创建单表
单表即表只存在于某一个DN节点,目前还不支持指定任意DN节点进行单表创建。可以通过多group的能力迂回实现:先添加一个DN节点,然后将该节点创建为一个独立的group中,可以命名为single_group。然后创建表时,指定表的group为刚刚创建的single_group。(注意:不能使用default_group中的节点,创建group的时候也会失败的)

```
[opentenbase@VM_0_37_centos shell]$ psql -h 172.16.0.42 -p 11387 -d postgres -U opentenbase
psql (PostgreSQL 10.0 opentenbase V2)
Type "help" for help.
postgres=# create table public.t1_signal
(
f1 int not null,
f2 varchar(20),
primary key(f1)
)
distribute by replication ;
to group single_group;
CREATE TABLE
```

### 1.5、几种表的适用场景简述

上述几种表类型有各自的使用场景,合理的使用表类型,对SQL的性能会带来很大的提升:
| 分布式表类型 | 描述 | 适用场景 | 使用约束 |
|--------------|------|----------|----------|
| 分片表 | 表记录按分片键值进行hash打散到所有分片中,每个分片都只有一部分数据。 | 数据量特别大,并且查询、删除、修改该表的数据时可以指定分片键作为操作条件,大多数语句不涉及跨库分布式事务访问。 | 查询、更新、删除数据时需要指定分片键;分片键字段类型、长度不能修改,分片键值不能直接更新;目前不能基于非分片键字段创建主键或者唯一索引。 |
| 复制表 | 所有分片中都存储一份相同的全量数据。 | 经常要使用非分片键字段JOIN并且更新频率较低的小表推荐使用复制表。 | 该表并发更新低、数据量少,不需要同步该表的数据到Kafka。 |
| 单表 | 存储在一个专门定义的group中,这个group中只有一个分片。 | 查询、删除、修改该表的数据时无法利用分片键,更新频繁,但数据量不是特别大。 | 更新频繁,数据量不是特别大,不需要与其它分片表或者复制表进行JOIN操作。 |



## 2、DML相关操作
### 2.1、INSERT
Expand Down

0 comments on commit b166bc5

Please sign in to comment.