7.OceanBase分区表管理

本文展示了在OceanBase数据库中创建和管理各种类型的分区表的方法,包括RANGE、RANGECOLUMNS、LIST、LISTCOLUMNS、HASH、KEY以及二级分区等。同时,提到了查询分区表、添加分区的操作,并强调了OB分区的一些限制和最佳实践。
摘要由CSDN通过智能技术生成

1.创建分区表

1.创建范围分区。
CREATE TABLE tbl1_r (log_id BIGINT NOT NULL,log_value VARCHAR(50),log_date TIMESTAMP NOT NULL)
       PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) 
        (PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01'))
       , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01'))
       , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01'))
       , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01'))
       , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01'))
       , PARTITION M202006 VALUES LESS THAN(UNIX_TIMESTAMP('2020/07/01'))
       , PARTITION M202007 VALUES LESS THAN(UNIX_TIMESTAMP('2020/08/01'))
       , PARTITION M202008 VALUES LESS THAN(UNIX_TIMESTAMP('2020/09/01'))
       , PARTITION M202009 VALUES LESS THAN(UNIX_TIMESTAMP('2020/10/01'))
       , PARTITION M202010 VALUES LESS THAN(UNIX_TIMESTAMP('2020/11/01'))
       , PARTITION M202011 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/01'))
       , PARTITION M202012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01'))
        );

		
		
		
2.创建: RANGE COLUMNS 分区。
 CREATE TABLE tbl1_log_rc (log_id BIGINT NOT NULL,log_value VARCHAR(50),log_date DATE NOT NULL)
       PARTITION BY RANGE COLUMNS(log_date) 
        (PARTITION M202001 VALUES LESS THAN('2020/02/01')
       , PARTITION M202002 VALUES LESS THAN('2020/03/01')
       , PARTITION M202003 VALUES LESS THAN('2020/04/01')
       , PARTITION M202004 VALUES LESS THAN('2020/05/01')
       , PARTITION M202005 VALUES LESS THAN('2020/06/01')
       , PARTITION M202006 VALUES LESS THAN('2020/07/01')
       , PARTITION M202007 VALUES LESS THAN('2020/08/01')
       , PARTITION M202008 VALUES LESS THAN('2020/09/01')
       , PARTITION M202009 VALUES LESS THAN('2020/10/01')
       , PARTITION M202010 VALUES LESS THAN('2020/11/01')
       , PARTITION M202011 VALUES LESS THAN('2020/12/01')
       , PARTITION M202012 VALUES LESS THAN('2021/01/01')
       , PARTITION MMAX VALUES LESS THAN MAXVALUE
        );
 
3.创建LIST分区。
CREATE TABLE tbl1_l (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50))
       PARTITION BY LIST(col1) 
        (PARTITION p0 VALUES IN (1, 2, 3),
         PARTITION p1 VALUES IN (5, 6),
         PARTITION p2 VALUES IN (DEFAULT)
        ); 
4.创建LIST COLUMNS 分区。
 CREATE TABLE tbl1_lc (id INT,partition_id VARCHAR(2))
       PARTITION BY LIST COLUMNS(partition_id)
        (PARTITION p0 VALUES IN ('00','01'),
         PARTITION p1 VALUES IN ('02','03'),
         PARTITION p2 VALUES IN (DEFAULT)
        );
 
5.创建HASH分区。
CREATE TABLE tbl1_h(col1 INT,col2 VARCHAR(50))
       PARTITION BY HASH(col1) PARTITIONS 60; 
 
6.创建KEY 分区。 
CREATE TABLE tbl1_k(id INT,gmt_create DATETIME,info VARCHAR(20))
       PARTITION BY KEY(id,gmt_create) PARTITIONS 10; 
 
 
7.创建范围二级分区。
 CREATE TABLE tbl_rr(col1 INT,col2 INT,col3 INT)
       PARTITION BY RANGE(col1)
       SUBPARTITION BY RANGE(col2)
       SUBPARTITION TEMPLATE
        (SUBPARTITION mp1 VALUES LESS THAN(100),
         SUBPARTITION mp2 VALUES LESS THAN(200),
         SUBPARTITION mp3 VALUES LESS THAN(300)
        )
        (PARTITION p0 VALUES LESS THAN(100),
         PARTITION p1 VALUES LESS THAN(200),
         PARTITION p2 VALUES LESS THAN(300)
        );
 
8.RANGE COLUMNS+RANGE 二级分区。
CREATE TABLE t2_m_rcr (col1 INT NOT NULL,col2 varchar(50),col3 INT NOT NULL) 
PARTITION BY RANGE COLUMNS(col1)
SUBPARTITION BY RANGE(col3)
SUBPARTITION TEMPLATE 
(SUBPARTITION mp0 VALUES LESS THAN(1000),
 SUBPARTITION mp1 VALUES LESS THAN(2000),
 SUBPARTITION mp2 VALUES LESS THAN(3000)
)
(PARTITION p0 VALUES LESS THAN(100),
 PARTITION p1 VALUES LESS THAN(200),
 PARTITION p2 VALUES LESS THAN(300)
);  
 
8.RANGE COLUMNS+RANGE COLUMNS二级分区。
 CREATE TABLE t_m_rcrc(col1 INT,col2 INT) 
       PARTITION BY RANGE COLUMNS(col1)
       SUBPARTITION BY RANGE COLUMNS(col2)
       SUBPARTITION TEMPLATE 
        (SUBPARTITION mp0 VALUES LESS THAN(1000),
         SUBPARTITION mp1 VALUES LESS THAN(2000),
         SUBPARTITION mp2 VALUES LESS THAN(3000)
        )
        (PARTITION p0 VALUES LESS THAN(100),
         PARTITION p1 VALUES LESS THAN(200),
         PARTITION p2 VALUES LESS THAN(300)
        ); 
	

9.RANGE COLUMNS+	LIST COLUMNS 二级分区。
 CREATE TABLE t_m_rclc(col1 INT,col2 INT) 
       PARTITION BY RANGE COLUMNS(col1)
       SUBPARTITION BY LIST COLUMNS(col2)
       SUBPARTITION TEMPLATE 
        (SUBPARTITION mp0 VALUES IN(1,3),
         SUBPARTITION mp1 VALUES IN(4,6),
         SUBPARTITION mp2 VALUES IN(7)
        )
        (PARTITION p0 VALUES LESS THAN(100),
         PARTITION p1 VALUES LESS THAN(200),
         PARTITION p2 VALUES LESS THAN(300)
        ); 		
	

2.分区表查看及分区名字查看。

MySQL [oceanbase]> 
SELECT t.table_name,p.part_name,p.part_idx FROM __all_part p 
     LEFT JOIN __all_table t ON p.`table_id`=t.`table_id` 
     ORDER BY t.table_name,p.part_idx;
+-------------+-----------+----------+
| table_name  | part_name | part_idx |
+-------------+-----------+----------+
| t2_m_rcr    | p0        |        0 |
| t2_m_rcr    | p1        |        1 |
| t2_m_rcr    | p2        |        2 |
| tbl1_h      | p0        |        0 |
| tbl1_h      | p1        |        1 |
| tbl1_h      | p2        |        2 |
| tbl1_h      | p3        |        3 |
| tbl1_h      | p4        |        4 |
| tbl1_h      | p5        |        5 |
| tbl1_h      | p6        |        6 |
| tbl1_h      | p7        |        7 |
| tbl1_h      | p8        |        8 |
| tbl1_h      | p9        |        9 |
| tbl1_h      | p10       |       10 |
| tbl1_h      | p11       |       11 |
| tbl1_h      | p12       |       12 |
| tbl1_h      | p13       |       13 |
| tbl1_h      | p14       |       14 |
| tbl1_h      | p15       |       15 |
| tbl1_h      | p16       |       16 |
| tbl1_h      | p17       |       17 |
| tbl1_h      | p18       |       18 |
| tbl1_h      | p19       |       19 |
| tbl1_h      | p20       |       20 |
| tbl1_h      | p21       |       21 |
| tbl1_h      | p22       |       22 |
| tbl1_h      | p23       |       23 |
| tbl1_h      | p24       |       24 |
| tbl1_h      | p25       |       25 |
| tbl1_h      | p26       |       26 |
| tbl1_h      | p27       |       27 |
| tbl1_h      | p28       |       28 |
| tbl1_h      | p29       |       29 |
| tbl1_h      | p30       |       30 |
| tbl1_h      | p31       |       31 |
| tbl1_h      | p32       |       32 |
| tbl1_h      | p33       |       33 |
| tbl1_h      | p34       |       34 |
| tbl1_h      | p35       |       35 |
| tbl1_h      | p36       |       36 |
| tbl1_h      | p37       |       37 |
| tbl1_h      | p38       |       38 |
| tbl1_h      | p39       |       39 |
| tbl1_h      | p40       |       40 |
| tbl1_h      | p41       |       41 |
| tbl1_h      | p42       |       42 |
| tbl1_h      | p43       |       43 |
| tbl1_h      | p44       |       44 |
| tbl1_h      | p45       |       45 |
| tbl1_h      | p46       |       46 |
| tbl1_h      | p47       |       47 |
| tbl1_h      | p48       |       48 |
| tbl1_h      | p49       |       49 |
| tbl1_h      | p50       |       50 |
| tbl1_h      | p51       |       51 |
| tbl1_h      | p52       |       52 |
| tbl1_h      | p53       |       53 |
| tbl1_h      | p54       |       54 |
| tbl1_h      | p55       |       55 |
| tbl1_h      | p56       |       56 |
| tbl1_h      | p57       |       57 |
| tbl1_h      | p58       |       58 |
| tbl1_h      | p59       |       59 |
| tbl1_k      | p0        |        0 |
| tbl1_k      | p1        |        1 |
| tbl1_k      | p2        |        2 |
| tbl1_k      | p3        |        3 |
| tbl1_k      | p4        |        4 |
| tbl1_k      | p5        |        5 |
| tbl1_k      | p6        |        6 |
| tbl1_k      | p7        |        7 |
| tbl1_k      | p8        |        8 |
| tbl1_k      | p9        |        9 |
| tbl1_l      | p0        |        0 |
| tbl1_l      | p1        |        1 |
| tbl1_l      | p2        |        2 |
| tbl1_lc     | p0        |        0 |
| tbl1_lc     | p1        |        1 |
| tbl1_lc     | p2        |        2 |
| tbl1_log_rc | M202001   |        0 |
| tbl1_log_rc | M202002   |        1 |
| tbl1_log_rc | M202003   |        2 |
| tbl1_log_rc | M202004   |        3 |
| tbl1_log_rc | M202005   |        4 |
| tbl1_log_rc | M202006   |        5 |
| tbl1_log_rc | M202007   |        6 |
| tbl1_log_rc | M202008   |        7 |
| tbl1_log_rc | M202009   |        8 |
| tbl1_log_rc | M202010   |        9 |
| tbl1_log_rc | M202011   |       10 |
| tbl1_log_rc | M202012   |       11 |
| tbl1_log_rc | MMAX      |       12 |
| tbl1_r      | M202001   |        0 |
| tbl1_r      | M202002   |        1 |
| tbl1_r      | M202003   |        2 |
| tbl1_r      | M202004   |        3 |
| tbl1_r      | M202005   |        4 |
| tbl1_r      | M202006   |        5 |
| tbl1_r      | M202007   |        6 |
| tbl1_r      | M202008   |        7 |
| tbl1_r      | M202009   |        8 |
| tbl1_r      | M202010   |        9 |
| tbl1_r      | M202011   |       10 |
| tbl1_r      | M202012   |       11 |
| tbl_rr      | p0        |        0 |
| tbl_rr      | p1        |        1 |
| tbl_rr      | p2        |        2 |
| t_m_rclc    | p0        |        0 |
| t_m_rclc    | p1        |        1 |
| t_m_rclc    | p2        |        2 |
| t_m_rcrc    | p0        |        0 |
| t_m_rcrc    | p1        |        1 |
| t_m_rcrc    | p2        |        2 |
+-------------+-----------+----------+
113 rows in set (0.00 sec)

3.分区表查询

MySQL [oceanbase]> select * from sjzt.t2_m_rcr partition(p1);
02001);	
select * from sjzt.tbl1_r partition(M202001);	
select * from sjzt.t_m_rclc partition(p1);	Empty set (0.01 sec)

MySQL [oceanbase]> select * from sjzt.tbl1_h partition(p1);
Empty set (0.10 sec)

MySQL [oceanbase]> select * from sjzt.tbl1_k partition(p1);
Empty set (0.06 sec)

MySQL [oceanbase]> select * from sjzt.tbl1_l partition(p1);
Empty set (0.14 sec)

MySQL [oceanbase]> select * from sjzt.tbl1_lc partition(p1);
Empty set (0.08 sec)

MySQL [oceanbase]> select * from sjzt.tbl1_log_rc partition(M202001);
Empty set (0.06 sec)

MySQL [oceanbase]> select * from sjzt.tbl1_r partition(M202001);
Empty set (0.06 sec)

MySQL [oceanbase]> select * from sjzt.t_m_rclc partition(p1);
Empty set (0.10 sec)

4.添加分区

alter table tbl1_r add partition(partition M202101 VALUES LESS THAN(UNIX_TIMESTAMP('2021/02/01')));	
 --OB分区拆分:不支持。
ALTER TABLE tbl1_log_rc ADD PARTITION  (PARTITION M202101 VALUES LESS THAN ('2021/02/01'));
alter table tbl_rr add partition (PARTITION p3 VALUES LESS THAN(400));		

5.总结

OB分区不支持裁剪。
1.分区键必须是主键的子集。 
2.分区范围最好不要指定 max 分区,因为早前版本不支持分区split;

3.二级分区增加分区时仅指定一级分区即可,二级分区自动添加。

6.分区表类型。

RANGE  分区
RANGE COLUMNS 分区
LIST 分区
LIST COLUMNS 分区
HASH分区 
KEY 分区 
RANGE+RANGE:范围二级分区 
RANGE COLUMNS+RANGE 二级分区
RANGE COLUMNS+RANGE COLUMNS二级分区。
RANGE COLUMNS+LIST COLUMNS 二级分区。

OceanBase 是一款分布式数据库系统,它支持多种特性包括分区表操作。分区表数据库系统用于优化查询性能的一种机制,通过将大表划分为更小、更独立的部分来提高查询效率。 ### OceanBase 分区表的基本概念 在 OceanBase 中创建分区表时,你需要指定表应该如何划分,通常基于某一列值的范围进行切分。OceanBase 支持多种类型的分区策略,如范围分区(Range Partitioning)、列表分区(List Partitioning)、哈希分区(Hash Partitioning)等。每种分区方式都有其特定的应用场景。 #### 插入数据到分区表 当你向分区表插入数据时,OceanBase 会根据分区键的值自动将数据放置在相应的分区中。OceanBase分区规则决定了如何分配数据到不同的物理存储部分,这有助于减少跨节点的磁盘访问次数,进而提升查询性能。 ### 示例 假设我们有一个名为 `sales` 的表,包含销售记录,并希望通过日期字段进行范围分区: ```sql CREATE TABLE sales ( sale_id INT PRIMARY KEY, product VARCHAR(50), sale_date DATE, amount DECIMAL(10,2) ) PARTITION BY RANGE (sale_date); ``` 在这个例子中,表 `sales` 根据 `sale_date` 字段进行了范围分区。你可以想象,每个具体的日期都会对应一个单独的物理分区。 #### 向分区表插入数据 为了插入一条数据,只需使用标准的 INSERT INTO 语句,并明确指出你要插入的数据应属于哪个分区: ```sql INSERT INTO sales(sale_id, product, sale_date, amount) VALUES(1, 'Product A', '2023-09-01', 100.5); ``` 如果数据库配置了合理的时间间隔来处理分区内的数据,OceanBase 将自动处理数据的分布情况,确保数据按照正确的分区规则存储。 ### 注意事项 1. **分区键选择**:选择合适的分区键至关重要,它应该能够均匀地覆盖整个数据集,并尽可能避免极端偏斜的情况。 2. **查询优化**:合理利用分区可以显著提高查询速度,但在设计时需考虑到复杂查询可能会涉及多个分区的情况。 3. **维护与迁移**:定期检查分区的有效性和数据分布情况,必要时调整分区策略或进行数据迁移操作。 4. **数据一致性**:在高并发环境中,分区表的操作需要考虑数据的一致性问题,确保更新操作不会导致数据不一致或丢失。 总之,在 OceanBase 中使用分区表是一种高效管理大量数据的技术手段,能够极大地提升查询性能并优化数据库的整体运行效率。合理规划分区策略是实现这一目标的关键步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值