Move the docs folder

This commit is contained in:
LINxiansheng
2022-02-10 14:51:49 +08:00
committed by LINxiansheng
parent 7c6dcc6712
commit d42f317422
1160 changed files with 0 additions and 3 deletions

View File

@ -0,0 +1,24 @@
关于表
========================
本节主要介绍表的定义及设计原则。
在 OceanBase 数据库中,表是最基础的数据存储单元。表包含了所有用户可以访问的数据,每个表包含多行记录,每个记录由多个列组成。
在创建和使用表之前,管理员可以根据业务需求进行规划,主要需要遵循以下原则:
* 应规范化使用表,合理估算表结构,使数据冗余达到最小。
* 为表的每个列选择合适的 SQL 数据类型。
有关 SQL 数据类型的详细描述,请参见 《SQL 参考》。
* 根据实际需求,创建合适类型的表,OceanBase 数据库当前支持非分区表和分区表。

View File

@ -0,0 +1,128 @@
创建表
========================
您可以使用 `CREATE TABLE` 语句来创建表。
本节主要介绍非分区表的创建,分区表的创建及使用请参见 [创建分区表](../../../6.administrator-guide/5.data-distribution-and-link-management/1.partition-table-and-partitioned-index-management/3.create-a-partition-table/1.level-1-partition-table-2.md) 章节。
创建非分区表
---------------------------
创建非分区表是指创建只有一个分区的表。
创建非分区表的示例语句如下:
```sql
obclient>CREATE TABLE table_name1(w_id int
, w_ytd decimal(12,2)
, w_tax decimal(4,4)
, w_name varchar(10)
, w_street_1 varchar(20)
, w_street_2 varchar(20)
, w_city varchar(20)
, w_state char(2)
, w_zip char(9)
, unique(w_name, w_city)
, primary key(w_id)
);
Query OK, 0 rows affected (0.09 sec)
obclient>CREATE TABLE table_name2 (c_w_id int NOT NULL
, c_d_id int NOT null
, c_id int NOT null
, c_discount decimal(4, 4)
, c_credit char(2)
, c_last varchar(16)
, c_first varchar(16)
, c_middle char(2)
, c_balance decimal(12, 2)
, c_ytd_payment decimal(12, 2)
, c_payment_cnt int
, c_credit_lim decimal(12, 2)
, c_street_1 varchar(20)
, c_street_2 varchar(20)
, c_city varchar(20)
, c_state char(2)
, c_zip char(9)
, c_phone char(16)
, c_since date
, c_delivery_cnt int
, c_data varchar(500)
, index icust(c_last, c_d_id, c_w_id, c_first, c_id)
, FOREIGN KEY (c_w_id) REFERENCES table_name1(w_id)
, primary key (c_w_id, c_d_id, c_id)
);
Query OK, 0 rows affected (0.10 sec)
```
示例中创建了 2 个表,并同时对表中的列定义了一些约束信息,包括在不同列上创建的主键和外键等。更多主键、外键等的介绍,请参见 [定义列的约束类型](../../../6.administrator-guide/4.database-object-management-1/1.manage-tables/4.define-the-constraint-type-for-a-column.md) 章节。
有关 SQL 数据类型的详细描述,请参见《OceanBase 数据库 SQL参考》。
**说明**
* 基于性能和后期维护的需要,建议建表时为表设计主键或者唯一键。如果没有合适的字段作为主键,MySQL 模式中可以在创建表时不指定主键,待表创建成功后系统会为无主键表指定自增列作为隐藏主键。
* 由于 `ALTER TABLE` 语句不支持在后期增加主键,故在创建表时就需要设置主键。
复制已有表的数据创建新表
---------------------------------
在 OceanBase 数据库的 MySQL 模式下,可以使用 `CREATE TABLE AS SELECT` 语句复制表的数据,但是结构并不完全一致,并且会丢失约束、索引、默认值、分区等信息。
示例语句如下:
```unknow
obclient>CREATE TABLE t1_copy AS SELECT * FROM t1;
Query OK, 3 rows affected (0.12 sec)
```
还可以使用 `CREATE TABLE LIKE` 语句复制表结构,但是不能复制表数据。
示例语句如下:
```sql
obclient>CREATE TABLE t1_like like t1;
Query OK, 0 rows affected (0.11 sec)
```
创建复制表
--------------------------
复制表是 OceanBase 数据库的高级优化手段。
通常 OceanBase 集群是三副本架构,默认每个表的每个分区在 OceanBase 数据库中会有三个副本数据,在角色上分为一个主副本(Leader 副本)和两个备副本(Follower 副本),默认由主副本提供读写服务。
复制表可以在指定租户的每台机器上都有一个备副本,并且主副本与所有备份的数据使用全同步策略保持强同步。这样做的目的是为了让业务有些 SQL 关联查询时能在同一节点内部执行,以获取更好的性能。
复制表的语法是在 `CREATE TABLE` 语句后增加 `DUPLICATE_SCOPE` 选项。
示例语句如下:
```sql
obclient>CREATE TABLE table_name (i_id int
, i_name varchar(24)
, i_price decimal(5,2)
, i_data varchar(50)
, i_im_id int
, primary key(i_id)) COMPRESS FOR QUERY pctfree=0 BLOCK_SIZE=16384
duplicate_scope='cluster' locality='F,R{all_server}@doc_1, F,R{all_server}@doc_2,F,R{all_server}@doc_3' primary_zone='doc_1';
```

View File

@ -0,0 +1,74 @@
定义自增列
==========================
描述
-----------------------
如果创建表时需要某个数值列的值不重复并且保持递增,这就是自增列。在 MySQL 租户里,列的类型可以定义为`AUTO_INCREMENT`,即 MySQL 租户的自增列。
自增列有三个重要属性,包括自增起始值、自增步长和自增列缓存大小,通过以下三个租户变量参数来控制。
| 系统变量 | 说明 |
|---------------------------|------------------------------------------------------|
| auto_increment_cache_size | 用于设置自增的缓存个数,取值范围为 \[1, 100000000\],默认值为 1000000。 |
| auto_increment_increment | 用于设置自增步长,取值范围为 \[1, 65535\],默认值为 1。 |
| auto_increment_offset | 用于确定`AUTO_INCREMENT`列值的起点,取值范围为 \[1, 65535\],默认值为 1。 |
示例
-----------------------
下面创建了一个自增列,在使用`INSERT`语句插入记录时不需要指定自增列,OceanBase 数据库会自动为该列填充值。
如果在`INSERT`时指定了自增列的值,且这个值为 0,则 OceanBase 数据库会用自增列的下一个值填充列的值;如果这个值比当前最大值小,则不影响自增列的下一个值的计算;如果这个值比当前值最大值大,则自增列会把插入值和自增列缓存值的和作为下次自增的起始值。
```sql
obclient> CREATE TABLE t1(id bigint not null auto_increment primary key, name varchar(50), gmt_create timestamp not null default current_timestamp);
Query OK, 0 rows affected (0.08 sec)
obclient> INSERT INTO t1(name) VALUES('A'),('B'),('C');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t1;
+----+------+---------------------+
| id | name | gmt_create |
+----+------+---------------------+
| 1 | A | 2020-04-03 17:09:55 |
| 2 | B | 2020-04-03 17:09:55 |
| 3 | C | 2020-04-03 17:09:55 |
+----+------+---------------------+
3 rows in set (0.01 sec)
obclient> INSERT INTO t1(id, name) VALUES(0, 'D');
Query OK, 1 row affected (0.00 sec)
obclient> INSERT INTO t1(id, name) VALUES(-1,'E');
Query OK, 1 row affected (0.00 sec)
obclient> INSERT INTO t1(id, name) VALUES(10,'F');
Query OK, 1 row affected (0.01 sec)
obclient> INSERT INTO t1(name) VALUES('G');
Query OK, 1 row affected (0.00 sec)
obclient> SELECT * FROM t1;
+---------+------+---------------------+
| id | name | gmt_create |
+---------+------+---------------------+
| -1 | E | 2020-04-03 17:10:24 |
| 1 | A | 2020-04-03 17:09:55 |
| 2 | B | 2020-04-03 17:09:55 |
| 3 | C | 2020-04-03 17:09:55 |
| 4 | D | 2020-04-03 17:10:19 |
| 10 | F | 2020-04-03 17:10:29 |
| 1000011 | G | 2020-04-03 17:10:34 |
+---------+------+---------------------+
7 rows in set (0.00 sec)
```

View File

@ -0,0 +1,156 @@
定义列的约束类型
=============================
为了确保表里的数据符合业务规则,您可以在列上定义约束。
约束定义在列上,可以限制列里存储的值。当尝试在该列上写入或更新为违反约束定义的值时,会触发一个错误并回滚这个操作;当尝试在已有的表的列上加上一个跟现有数据相冲突的约束时,也会触发一个错误并回滚这个操作。
约束类型
-------------------------
下面以 `ware` 表和 `cut` 表为例,介绍 OceanBase 数据库的约束类型。
```sql
obclient>CREATE TABLE ware (w_id int
, w_ytd decimal(12,2)
, w_tax decimal(4,4)
, w_name varchar(10)
, w_street_1 varchar(20)
, w_street_2 varchar(20)
, w_city varchar(20)
, w_state char(2)
, w_zip char(9)
, unique(w_name, w_city)
, primary key(w_id)
);
Query OK, 0 rows affected (0.09 sec)
obclient>CREATE TABLE cust (c_w_id int NOT NULL
, c_d_id int NOT NULL
, c_id int NOT NULL
, c_discount decimal(4, 4)
, c_credit char(2)
, c_last varchar(16)
, c_first varchar(16)
, c_middle char(2)
, c_balance decimal(12, 2)
, c_ytd_payment decimal(12, 2)
, c_payment_cnt int
, c_credit_lim decimal(12, 2)
, c_street_1 varchar(20)
, c_street_2 varchar(20)
, c_city varchar(20)
, c_state char(2)
, c_zip char(9)
, c_phone char(16)
, c_since date
, c_delivery_cnt int
, c_data varchar(500)
, index icust(c_last, c_d_id, c_w_id, c_first, c_id)
, FOREIGN KEY (c_w_id) REFERENCES table_name1(w_id)
, primary key (c_w_id, c_d_id, c_id)
);
Query OK, 0 rows affected (0.10 sec)
```
* 非空约束(`NOT NULL`):不允许约束包含的列的值为 `NULL`
例如,`ware` 表的 `w_name` 列类型后面有 `NOT NULL` 约束,表示业务约束每个仓库必须有个名称。
有非空约束的列,在 `INSERT` 语句中必须指明该列的值,除非该列还定义了默认值。例如,`cust` 表的列 `c_discount` 定义了默认值 `0.99`,即业务上每个人默认折扣是 `0.99`
* 唯一约束(`UNIQUE`):不允许约束包含的列的值有重复值,但是可以有多个 `NULL` 值。
例如,`ware` 表的 `(w_name, w_city)` 列上有个唯一约束,表示每个城市里仓库的名称必须是不重复的。
* 主键约束(`PRIMARY KEY`): `NOT NULL` 约束和唯一约束的组合。
例如,`ware` 表和 `cust` 表都有个主键 `w_id``c_id`,这两列不允许为 `NULL` 并且必须是不重复的。
```sql
obclient>CREATE TABLE cust (c_w_id int NOT NULL,
c_d_id int NOT NULL, c_id int NOT NULL,
c_discount decimal(4, 4),
c_credit char(2),
c_last varchar(16),
c_first varchar(16),
c_middle char(2),
c_balance decimal(12, 2),
c_ytd_payment decimal(12, 2),
c_payment_cnt int,
c_credit_lim decimal(12, 2),
c_street_1 varchar(20),
c_street_2 varchar(20),
c_city varchar(20),
c_state char(2),
c_zip char(9),
c_phone char(16),
c_since date,
c_delivery_cnt int,
c_data varchar(500),
index icust(c_last, c_d_id, c_w_id, c_first, c_id),
FOREIGN KEY (c_w_id) REFERENCES table_name1(w_id),
primary key (c_w_id, c_d_id, c_id)
);
Query OK, 0 rows affected (0.10 sec)
```
* 外键约束(`FOREIGN KEY`):要求约束的列的值取自于另外一个表的主键列。
例如,`cust` 表的 `c_w_id `上有个外键约束引用了 `ware` 表的 `w_id` 列,表示业务上顾客归属的仓库必须是属于仓库表里的仓库。
OceanBase 数据库默认开启了外键约束检查,外键约束检查开关由租户变量 `foreign_key_checks` 来控制。
默认情况下,约束创建后为启用状态。
**说明**
目前 OceanBase 数据库不支持通过 `ALTER TABLE` 语句增加或修改约束,因此您需要在创建表时即确定好表的约束。
关于时间列的默认时间设置
------------------------------
当列上有 `NOT NULL` 约束时,通常建议设置为默认值。当列类型是日期或时间类型时,可以设置默认值为数据库当前时间。
示例:为表的时间列设置默认值,可以使用 `sysdate` 或 `systimestamp` 函数。
```sql
obclient> CREATE TABLE t1(
id bigint not null primary KEY
, gmt_create datetime not null default current_timestamp
, gmt_modified datetime not null default current_timestamp
);
Query OK, 0 rows affected (0.07 sec)
obclient> INSERT INTO t1(id) VALUES(1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t1;
+----+---------------------+---------------------+
| id | gmt_create | gmt_modified |
+----+---------------------+---------------------+
| 1 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
| 2 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
| 3 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
+----+---------------------+---------------------+
3 rows in set (0.00 sec)
```

View File

@ -0,0 +1,14 @@
查看表的定义
===========================
表创建成功后,您可以通过 SQL 语句来查看表的定义。
MySQL 模式下,您可以使用 `SHOW CREATE TABLE` 语句查看表的定义。
示例如下:
```sql
obclient> SHOW CREATE TABLE test;
```

View File

@ -0,0 +1,104 @@
更改表
========================
表创建成功后,您可以使用 `ALTER TABLE` 语句对表进行修改。
修改索引
-------------------------
* MySQL 模式
OceanBase 数据库的 MySQL 模式支持增加唯一索引和普通索引,同时还支持修改索引的属性。
* 增加唯一索引
OceanBase 数据库支持在创建表后为表增加唯一索引。如果创建表时同时设置了主键,OceanBase 数据库会默认为主键列创建一个唯一索引。
增加唯一索引的示例如下:
```sql
obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
Query OK, 0 rows affected (0.04 sec)
obclient> ALTER TABLE test ADD UNIQUE INDEX index_name(c2);
Query OK, 0 rows affected (0.53 sec)
```
* 增加普通索引
OceanBase 数据库的 MySQL 模式支持一次增加多个索引,索引关键字用 `INDEX` 或 `KEY` 均可以。
```sql
obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
Query OK, 0 rows affected (0.04 sec)
obclient> ALTER TABLE test ADD INDEX myidx(c1,c2);
Query OK, 0 rows affected (0.55 sec)
```
* 修改索引属性
OceanBase 数据库的 MySQL 模式支持将索引修改为可见或不可见,默认索引均可见,您可以将索引修改为不可见。
语法如下:
```sql
obclient> ALTER TABLE test ALTER INDEX myidx INVISIBLE;
```
重命名表
-------------------------
表创建成功后,您可以更改表名。
OceanBase 数据库的 MySQL 模式支持重命名表。
示例如下:
```sql
obclient> ALTER TABLE test RENAME TO t1;
```
删除表组
-------------------------
OceanBase 数据库的 MySQL 模式支持删除表所属的表组。
MySQL 模式下删除表组的示例如下:
```sql
obclient> ALTER TABLE test DROP TABLEGROUP grp1;
```
更多表组相关信息,请参见 [管理表组](../../../6.administrator-guide/4.database-object-management-1/2.manage-a-table-group/1.about-table-groups.md) 章节。
删除外键
-------------------------
OceanBase 数据库的 MySQL 模式支持删除表的外键。
* MySQL 模式下删除表的外键示例
```sql
obclient> ALTER TABLE test DROP FOREIGN KEY fk_name;
```

View File

@ -0,0 +1,62 @@
清空表
========================
当表中的数据不再使用时,可以删除表中的所有行,即清空该表。
OceanBase 数据库支持使用 `TRUNCATE TABLE``DELETE FROM` 语句清空指定表,但是保留表结构,包括表中定义的分区信息。从逻辑上说,`TRUNCATE TABLE` 语句与用于删除所有行的 `DELETE FROM` 语句的执行结果相同。
使用 TRUNCATE TABLE 语句
-----------------------------------------
`TRUNCATE TABLE` 语句提供了一种快速、有效删除表中所有行的方法,同时 `TRUNCATE TABLE` 语句是一个 DDL 语句,不会产生任何回滚信息。
执行 `TRUNCATE TABLE` 语句需要具备该表的删除和创建权限。
```sql
obclient>TRUNCATE TABLE table_name;
```
使用 DELETE FROM 语句
--------------------------------------
也可以使用 `DELETE FROM` 语句删除表中的行。
示例如下:
```sql
obclient>DELETE FROM table_name
```
使用 `DELETE FROM` 语句清空表时,如果表有很多行,会消耗较多系统资源。
TRUNCATE TABLE 语句与 DELETE FROM语句的差异
--------------------------------------------------------
`TRUNCATE TABLE` 语句与 `DELETE FROM` 语句的差异如下:
* `TRUNCATE TABLE` 操作会删除并重新创建表,比一行一行地删除行要快很多。
* `TRUNCATE TABLE` 语句的执行结果显示影响行数始终为 0 行。
* 使用 `TRUNCATE TABLE` 语句时,表管理程序不会记录最后被使用的 `AUTO_INCREMENT` 值,但是会从头开始计数。
* 不支持在进行事务处理和表锁定的过程中执行 `TRUNCATE TABLE` 操作。
* 只要表定义文件合法,就可以使用 `TRUNCATE TABLE` 语句将表重新创建为一个空表,即使数据或索引文件已经被破坏。

View File

@ -0,0 +1,42 @@
删除表
========================
当一个表不再使用时,可以使用 `DROP TABLE` 语句将其删除。
MySQL 模式
-----------------------------
删除表的示例如下:
```sql
obclient> DROP TABLE test;
```
或者
```sql
obclient> DROP TABLE IF EXISTS test;
```
在删除表时,如果指定了 ` EXISTS`,即使要删除的表不存在也不会报错;如果不指定 `IF EXISTS`,则会报错。
操作说明
-------------------------
对于 `DROP TABLE` 操作:
* 当租户关闭回收站功能时,`DROP TABLE` 操作表示删除表。回收站开关由系统变量 `recyclebin` 控制,默认为关闭状态。
* 当租户开启回收站功能时,`DROP TABLE` 操作表示删除的表会进入回收站。对于回收站中的表,后续您可以通过回收站功能进一步删除或恢复该表,回收站相关操作请参见 [数据库、表和索引级回收站](../../../6.administrator-guide/8.high-data-availability/1.recycle-bin-management/2.database-table-and-index-level-recycle-bin-1.md)。

View File

@ -0,0 +1,62 @@
关于表组
=========================
表组(Table Group)不是一个的物理对象,它是一个逻辑概念,表示一组表或者表的集合。属于这样一个集合的表需要满足一定的约束,即所有表必须拥有相同的 Locality(副本类型、个数及位置)、相同的 Primary Zone(Leader 位置及其优先级)以及相同的分区方式。
通过定义表组,您可以控制一组表在物理存储上的临近关系。对于包含分区表的表组,它由若干个分区组(Partition Group) 组成,每一个 Partition Group 包含每个分区表的一个分区。属于同一个 Partition Group 的所有 Partition 系统会通过自动调度使得它们位于同一台 OBServer 服务器上,且这些分区副本的 Leader 也位于一台 OBServer 上。
表组中所有表的限制说明:
* 分区类型需相同。
* 如果是 Key 分区,要求引用的列数相同,且分区个数相同(不要求列名相同)。
* 如果是 Hash 分区,要求分区个数相同。
* 如果是 Range Columns分区,要求引用的列数相同和分区数相同,且 Range 分割点相同(各 value 的规则相同)。
* 如果是 Range 分区,要求分区数相同,且 Range 分割点相同(各 value 的规则相同)。
* 对于二级分区,根据分区类型,限制如下:
* 如果是 Key 分区,要求引用的列数相同,且分区个数相同(不要求列名相同)。
* 如果是 Hash 分区,要求分区个数相同。
* 如果是 Range Columns分区,要求引用的列数相同和分区数相同,且 Range 分割点相同(各 value 的规则相同)。
* 分区增减只支持 Range 分区的表组。
* 无法通过 `ALTER TABLE SET table group ``ALTER TABLE GROUP add table` 语句表迁入到 OceanBase 数据库 V2.x.x 之前创建的表组中。
* 任何时候,将表加入 OceanBase 数据库 V2.x.x 之后创建的表组时,都会进行校验。如检查分区方式、Primary Zone 和 Locality 是否匹配。

View File

@ -0,0 +1,114 @@
表组管理命令
===========================
通过修改表的 `TABLEGROUP` 属性,可以把一个表加入或移出一个表组,或者改变其 `TABLEGROUP` 属性。修改了表的 `TABLEGROUP` 属性以后,RootService 会在后台执行副本的迁移,把属于同一个分组组的副本调度到同一台机器上,并发起命令把这些分区并入一个复制组(Replication Group)中。
创建表组
-------------------------
创建表组 `grp1` 的示例如下:
```sql
obclient> CREATE TABLEGROUP grp1;
```
移出表组
-------------
将表 `t1` 移出表组的示例如下:
```sql
obclient> ALTER TABLE t1 SET TABLEGROUP '';
```
迁入表组
-------------
将表 `t1` 加入表组 `grp1` 的示例如下:
```sql
obclient> ALTER TABLE t1 SET TABLEGROUP grp1;
```
迁移表组
-------------
将表 `t1`(原先在表组 `grp1` 中) 迁移进表组 `grp2` 的示例如下:
```sql
obclient> ALTER TABLE t1 SET TABLEGROUP grp2;
```
删除表组
-------------
下述为删除表组语句的语法,但是如果有任何表的 `TABLE GROUP` 属性引用了目标表组,则该表组不允许被删除。
```sql
obclient> DROP TABLEGROUP grp1;
```
修改分区方式
---------------
对于属于某一个表组的表,不允许使用 `ALTER TABLE` 直接修改该表的分区方式、Locality 和 Primary Zone 属性。必须使用 `ALTER TABLEGROUP` 语句来进行操作。
修改一个表组的分区方式、Locality 和 Primary Zone 属性时,实际上会同时原子地修改属于这个表组中所有表的对应属性。
修改 Locality
--------------------
将表组 `grp1` 中所有表的 Locality 都修改为 `F@z1,F@z3` 的示例如下:
```sql
obclient> ALTER TABLEGROUP grp1 SET locality = 'F@z1,F@z3';
```
修改 Primary Zone
------------------------
将表组 `grp1` 中所有表的 Primary Zone 都修改为 `z1,z2` 的示例如下:
```sql
obclient> ALTER TABLEGROUP grp1 SET primary_zone = 'z1,z2';
```
删除分区
-------------
将表组 `grp1` 中所有表的 `p0``p1`分区都删除的示例如下,该操作仅支持 Range 分区。
其中,`p0``p1` 是创建表组时为 Range 分区指定的分区名,而不是每个表上的分区名,系统根据 Range 分割点能够找到每个表对应的分区。
```sql
obclient> ALTER TABLEGROUP grp1 DROP PARTITION (p0,p1);
```
增加分区
-------------
为表组 `grp1` 中所有表都增加一个 `p4` 分区的示例如下,该操作仅支持 Range 分区。
```sql
obclient> ALTER TABLEGROUP grp1 ADD PARTITION (PARTITION p4 VALUES LESS THAN (200));
```

View File

@ -0,0 +1,8 @@
关于索引
=========================
表创建成功后,可以在表的一个或多个列上创建索引以加速表上的 SQL 语句执行速度。索引使用正确的话,可以减少物理 IO 或者逻辑 IO。
OceanBase 数据库的表存储模型为索引聚集表模型,如果用户未指定主键,系统会自动生成一个隐藏主键。

View File

@ -0,0 +1,49 @@
创建索引
=========================
本节主要介绍如何通过 `CREATE INDEX` 语句在非分区表上创建索引,分区表上索引的创建请参见 [局部索引](../../../6.administrator-guide/5.data-distribution-and-link-management/1.partition-table-and-partitioned-index-management/6.create-an-index-on-a-partition-table/1.local-index.md)章节。
OceanBase 数据库支持在非分区表和分区表上创建索引,索引可以是局部索引或全局索引,也可以是唯一索引或普通索引。如果是分区表的唯一索引,则唯一索引必须包含表分区的拆分键。
MySQL 模式下,创建索引的 SQL 语法格式如下:
```sql
CREATE [UNIQUE] INDEX index_name ON table_name ( column_list ) [LOCAL | GLOBAL] [ PARTITION BY column_list PARTITIONS N ] ;
```
MySQL 租户里,索引名称在表范围内不能重复,查看索引可以通过命令 `SHOW INDEX`
在 MySQL 租户里,新增索引还有一种方法,其 SQL 语法格式如下:
```sql
ALTER TABLE table_name
ADD INDEX|KEY index_name ( column_list ) ;
```
该语句可以一次增加多个索引,索引关键字用 `INDEX``KEY` 都可以。
示例:为非分区表创建普通索引。
```sql
obclient> CREATE TABLE test (c1 int primary key, c2 VARCHAR(10));
Query OK, 0 rows affected (0.20 sec)
obclient> CREATE INDEX idx ON test (c1, c2);
Query OK, 0 rows affected (0.59 sec)
obclient> SHOW INDEX FROM test;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
| test | 0 | PRIMARY | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES |
| test | 1 | idx | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES |
| test | 1 | idx | 2 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
3 rows in set (0.00 sec)
```

View File

@ -0,0 +1,14 @@
查看索引
=========================
本节主要介绍索引的查看方法。
MySQL 模式下,可以使用 `SHOW INDEX `语句查看表的索引。
示例:查看表 test 的索引。
```sql
obclient> SHOW INDEX FROM test;
```

View File

@ -0,0 +1,29 @@
删除索引
=========================
当索引过多时,维护开销会增大,您可以根据需要删除不必要的索引。
MySQL 模式下,删除索引的语法格式如下:
```sql
ALTER TABLE table_name DROP key|index index_name ;
```
或者
```sql
DROP INDEX index_name ON table_name;
```
删除表的索引的示例如下:
```sql
obclient> ALTER TABLE t3 DROP KEY t3_uk, DROP KEY t3_ind3;
Query OK, 0 rows affected (0.07 sec)
```

View File

@ -0,0 +1,61 @@
管理视图
=========================
本节主要介绍如何创建、修改和删除视图。
视图用来展示表的查询结果。大部分能使用表的地方,都可以使用视图。如果经常访问的数据分布在多个表里时,使用视图是最好的方法。
创建视图
-------------------------
您可以使用 `CREATE VIEW` 语句来创建视图。
示例:创建视图 stock_item。该视图内容取自 stock 和 item 两张表,两张表做表连接即可得到该视图。
```sql
obclient> CREATE VIEW stock_item
AS
SELECT /*+ leading(s) use_merge(i) */
i_price, i_name, i_data, s_i_id, s_w_id, s_order_cnt, s_ytd, s_remote_cnt, s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10
FROM stok s, item i
WHERE s.s_i_id = i.i_id;
Query OK, 0 rows affected (0.01 sec)
```
修改视图
-------------------------
您可以使用 `CREATE OR REPLACE VIEW` 语句来对视图进行修改。
示例:修改视图 stock_item。
```sql
obclient> CREATE OR REPLACE VIEW stock_item
AS
SELECT /*+ leading(s) use_merge(i) */
i_price, i_name, i_data, s_i_id, s_w_id, s_order_cnt, s_ytd, s_remote_cnt, s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10
FROM stok s, item i
WHERE s.s_i_id = i.i_id;
Query OK, 0 rows affected (0.02 sec)
```
删除视图
-------------------------
您可以使用 `DROP VIEW` 语句删除一个或多个视图,删除视图并不会删除视图引用的表。
如果当前视图被其他视图所引用,则视图删除后将会导致依赖当前视图的其他视图的查询失败。
删除视图时,需确保当前用户具备该视图的 DROP 权限。
示例:删除视图 V1。
```sql
obclient> DROP VIEW V1;
```

View File

@ -0,0 +1,173 @@
管理同义词
==========================
本节主要介绍如何创建和删除同义词。
在 OceanBase 数据库中,同义词是一个租户数据库对象的别名。使用同义词通常是为了管理权限方便,因为同义词可以隐藏另外一个数据对象的所有者权限。
创建同义词
--------------------------
您可以使用 `CREATE SYNONYM` 语句来创建同义词。
创建同义词时:
* 如果在当前数据库创建私有同义词,则当前用户需要具备 `CREATE SYNONYM` 权限。
* 如果在非当前数据库创建私有同义词,则当前用户需要具备以下权限:
* MySQL 模式:`CREATE SYNONYM` 权限
* 如果创建公共同义词,则当前用户需要具备以下权限:
* MySQL 模式:`CREATE SYNONYM` 权限
* 创建同义词的对象可以不存在,当前用户也不需要具有该对象的访问权限。
创建同义词的语法格式如下:
* MySQL 模式
```sql
CREATE [ OR REPLACE ] [ PUBLIC ] SYNONYM [ DATABASE. ]synonym FOR [ DATABASE. ]object;
```
MySQL 模式下 `CREATE SYNONYM` 语句的更多信息,请参见《SQL 参考》文档中的 [CREATE SYNONYM](../../../10.sql-reference/5.sql-statement/17.create-synonym.md) 章节。
示例:
* 创建一个私有同义词。
```sql
obclient> CREATE TABLE test(c1 int);
Query OK, 0 rows affected (0.18 sec)
obclient> CREATE SYNONYM s1 for test;
Query OK, 0 rows affected (0.05 sec)
obclient> INSERT INTO s1 VALUES(1);
Query OK, 1 row affected (0.02 sec)
obclient> SELECT * FROM s1;
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
```
* 创建一个公共同义词。
```sql
obclient> CREATE PUBLIC SYNONYM syn_pub FOR test;
Query OK, 0 rows affected (0.03 sec)
obclient> SELECT * FROM syn_pub;
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
```
删除同义词
--------------------------
您可以使用 `DROP SYNONYM` 语句来删除不需要使用的同义词。
删除同义词时:
* 如果删除的是私有同义词,则需要保证待删除的同义词在对应的数据库下,且当前用户需要具备以下权限:
* MySQL 模式的租户:`CREATE SYNONYM` 权限
* 如果删除的是公共同义词,则当前用户需要具备以下权限:
* MySQL 模式的租户:`CREATE SYNONYM` 权限
同时,在删除时,必须指定 `PUBLIC` 关键字,并且不能指定数据库。
删除同义词的语法格式如下:
* MySQL 模式
```sql
DROP [PUBLIC] SYNONYM [ DATABASE. ]synonym;
```
MySQL 模式下 `DROP SYNONYM` 语句的更多信息,请参见《SQL 参考》文档中的 [DROP SYNONYM](../../../10.sql-reference/5.sql-statement/33.drop-synonym.md) 章节。
示例:
* 删除一个私有同义词。
```sql
obclient> DROP SYNONYM test.s1;
Query OK, 0 rows affected (0.03 sec)
```
* 删除一个公共同义词。
```sql
obclient> DROP PUBLIC SYNONYM syn_pub;
Query OK, 0 rows affected (0.02 sec)
```