MySql创建分区表

原文地址:http://www.xifenfei.com/1030.html

仅做备份,原文的排版更好,推荐直接看原文.


一、前沿知识
1、分区表类型
RANGE分区、LIST分区、HASH分区、KEY分区、子分区

2、查询是否支持分区表
mysql> SHOW VARIABLES LIKE ‘%partition%’;
+———————–+——-+
| Variable_name | Value |
+———————–+——-+
| have_partition_engine | YES |
+———————–+——-+
1 row in set (0.00 sec)

3、MySQL分区处理NULL值的方式
MySQL中的分区在禁止空值(NULL)上没有进行处理,如果出现NULL,MySQL 把NULL视为0

二、分区表的创建
1、RANGE分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE employees (
     id INT NOT NULL ,
     fname VARCHAR (30),
     lname VARCHAR (30),
     hired DATE NOT NULL DEFAULT '1970-01-01' ,
     separated DATE NOT NULL DEFAULT '9999-12-31' ,
     job_code INT NOT NULL ,
     store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
     PARTITION p0 VALUES LESS THAN (6),
     PARTITION p1 VALUES LESS THAN (11),
     PARTITION p2 VALUES LESS THAN (16),
     PARTITION p3 VALUES LESS THAN MAXVALUE
);

2、 LIST分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE employees (
     id INT NOT NULL ,
     fname VARCHAR (30),
     lname VARCHAR (30),
     hired DATE NOT NULL DEFAULT '1970-01-01' ,
     separated DATE NOT NULL DEFAULT '9999-12-31' ,
     job_code INT ,
     store_id INT
)
PARTITION BY LIST(store_id)
     PARTITION pNorth VALUES IN (3,5,6,9,17),
     PARTITION pEast VALUES IN (1,2,10,11,19,20),
     PARTITION pWest VALUES IN (4,12,13,14,18),
     PARTITION pCentral VALUES IN (7,8,15,16)
);

Note:LIST分区没有类似如“VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义。将要匹配的任何值都必须在值列表中找到。

3、 HASH分区

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE employees (
     id INT NOT NULL ,
     fname VARCHAR (30),
     lname VARCHAR (30),
     hired DATE NOT NULL DEFAULT '1970-01-01' ,
     separated DATE NOT NULL DEFAULT '9999-12-31' ,
     job_code INT ,
     store_id INT
)
PARTITION BY HASH( YEAR (hired))
PARTITIONS 4;

3.1、LINEAR HASH分区

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE employees (
     id INT NOT NULL ,
     fname VARCHAR (30),
     lname VARCHAR (30),
     hired DATE NOT NULL DEFAULT '1970-01-01' ,
     separated DATE NOT NULL DEFAULT '9999-12-31' ,
     job_code INT ,
     store_id INT
)
PARTITION BY LINEAR HASH( YEAR (hired))
PARTITIONS 4;

Note:线性哈希功能使用的一个线性的2的幂(powers-of-two)运算法则,而常规哈希使用的是求哈希函数值的模数

4、KEY分区

1
2
3
4
5
6
7
CREATE TABLE tk (
     col1 INT NOT NULL ,
     col2 CHAR (5),
     col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;

Note:
1)按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的 哈希函数是由MySQL 服务器提供。MySQL 簇(Cluster)使用函数MD5()来实现KEY分区;对于使用其他存储引擎的表,服务器使用其自己内部的哈希函数,这些函数是基于与PASSWORD()一样的运算法则。

2)“CREATE TABLE … PARTITION BY KEY”的语法规则类似于创建一个通过HASH分区的表的规则。它们唯一的区别在于使用的关键字是KEY而不是HASH,并且KEY分区只采用一个或多个列名的一个列表。

5、子分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE TABLE ts (id INT , purchased DATE )
     PARTITION BY RANGE( YEAR (purchased))
     SUBPARTITION BY HASH(TO_DAYS(purchased))
     (
         PARTITION p0 VALUES LESS THAN (1990)
         (
             SUBPARTITION s0
                 DATA DIRECTORY = '/disk0/data'
                 INDEX DIRECTORY = '/disk0/idx' ,
             SUBPARTITION s1
                 DATA DIRECTORY = '/disk1/data'
                 INDEX DIRECTORY = '/disk1/idx'
         ),
         PARTITION p1 VALUES LESS THAN (2000)
         (
             SUBPARTITION s0
                 DATA DIRECTORY = '/disk2/data'
                 INDEX DIRECTORY = '/disk2/idx' ,
             SUBPARTITION s1
                 DATA DIRECTORY = '/disk3/data'
                 INDEX DIRECTORY = '/disk3/idx'
         ),
         PARTITION p2 VALUES LESS THAN MAXVALUE
         (
             SUBPARTITION s0
                 DATA DIRECTORY = '/disk4/data'
                 INDEX DIRECTORY = '/disk4/idx' ,
             SUBPARTITION s1
                 DATA DIRECTORY = '/disk5/data'
                 INDEX DIRECTORY = '/disk5/idx'
         )
     );

Note:子分区是分区表中每个分区的再次分割,DATA DIRECTORY/INDEX DIRECTORY确定数据和索引的存储位置


### 如何在 MySQL创建分区表 #### 分区策略的选择 为了有效地管理大量数据并提高查询性能,在设计分区表之前需考虑具体的业务场景来决定采用何种分区策略。常见的分区方式有 RANGE、LIST、HASH 和 KEY 等[^2]。 #### 创建带分区的新表 假设要基于 `order_date` 字段按年份范围划分订单记录,则可以按照如下 SQL 语句构建带有 RANGE 类型分区的表格: ```sql CREATE TABLE orders ( order_id INT NOT NULL, order_date DATE NOT NULL, amount DECIMAL(10,2), customer_name VARCHAR(50) ) PARTITION BY RANGE (YEAR(order_date))( PARTITION p_2020 VALUES LESS THAN (2021), PARTITION p_2021 VALUES LESS THAN (2022), PARTITION p_2022 VALUES LESS THAN (2023), PARTITION p_max VALUES LESS THAN MAXVALUE ); ``` 此命令会建立一张名为 `orders` 的新表,并将其划分为四个部分,其中最后一个分区用于存储超出已知日期范围的数据[^4]。 #### 向现有表添加分区功能 如果已经存在一个普通的非分区表而希望转换成分区结构的话,可以通过修改表定义的方式来实现这一点。这里给出向已有表追加 HASH 分区的例子: ```sql ALTER TABLE existing_table PARTITION BY HASH(id_column) PARTITIONS 8; ``` 上述代码片段表示将以散列算法为基础重新组织现有的 `existing_table` 表中的数据项至八个独立子集内;这里的 `id_column` 是用来计算哈希值的关键字列名。 #### 动态调整分区配置 随着应用的发展变化可能需要适时地增加新的时间段或改变原有的区间边界条件。对于这种情况下的维护工作来说,MySQL 提供了一系列 ALTER 命令支持灵活便捷的操作模式。例如,扩展时间跨度只需简单执行以下指令即可完成新增年度分片的任务: ```sql ALTER TABLE orders ADD PARTITION ( PARTITION p_new_year VALUES LESS THAN (TO_DAYS('2024-01-01')) ); ``` 这条语句将会给 `orders` 表额外附加一个新的分区单元专门容纳发生在下一年度内的交易事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值