同一表的所有分区必须使用同一个的存储引擎
如何禁止分区
启动服务器时指定—skip-partition,但所有分区表都不可访问
查看当前是否支持分区
mysql> SHOW VARIABLES LIKE '%partition%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
1 row in set (0.00 sec)
mysql> SHOW PLUGINS;
+------------+----------+----------------+---------+---------+
| Name | Status | Type | Library | License |
+------------+----------+----------------+---------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ndbcluster | DISABLED | STORAGE ENGINE | NULL | GPL |
+------------+----------+----------------+---------+---------+
11 rows in set (0.00 sec)
Mysql5.5在已有的range/list分区上引入新的分区类型,分别为range/list columns,主要有两个改进:
1 支持多列分区 2 分区列支持非整数类型,包括varchar/char/data/datatime
Range columns
CREATE TABLE rc4 (
a INT,
b INT,
c INT
)
PARTITION BY RANGE COLUMNS(a,b,c) (
PARTITION p0 VALUES LESS THAN (0,25,50),
PARTITION p1 VALUES LESS THAN (10,20,100),
PARTITION p2 VALUES LESS THAN (10,30,50)
PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
);
mysql> SELECT (0,25,50) < (10,20,100), (10,20,100) < (10,30,50);
+-------------------------+--------------------------+
| (0,25,50) < (10,20,100) | (10,20,100) < (10,30,50) |
+-------------------------+--------------------------+
| 1 | 1 |
+-------------------------+--------------------------+
1 row in set (0.00 sec)
List columns
CREATE TABLE customers_1 (
first_name VARCHAR(25),
last_name VARCHAR(25),
street_1 VARCHAR(30),
street_2 VARCHAR(30),
city VARCHAR(15),
renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Högsby', 'Mönsterås'),
PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Västervik'),
PARTITION pRegion_3 VALUES IN('Nässjö', 'Eksjö', 'Vetlanda'),
PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Växjo')
);
Linear Hash分区
除了普通的hash分区,mysql还支持linear hash分区,两者区别在于hash算法,linear hash使用powers-of-two而前者使用modulus,语法上唯一的区别hash前多一个关键字linear ;
优势:增删/合并/分割分区操作速度更快,尤其是TB级别的数据处理;
劣势:数据分布相对不会那么均匀
算法实现
假定分区数目为num,表达式函数为f()
普通hash分区:N = MOD(f, num)
Linear hash分区:首先计算出V = power(2, ceiling(log(2, num)))和 N = f(column) & (V -1),如果N小于num则将其插入第N个分区,否则继续对N计算 N = num & ceiling(V / 2)
--创建linear hash分区表,分区数6个
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
PARTITION BY LINEAR HASH( YEAR(col3) )
PARTITIONS 6;
--插入两条记录,col3分别为’2003-04-14’和’1998-10-19’,则依照前述计算规则
--‘2003-04-14’
V = power(2, ceiling(log(2, 6))) = 8, N = year(‘2003-04-14’) & (8 – 1) = 2003 & 7 = 3;将其插入第3个分区
--‘1998-10-19’
V = 8, N= year(‘1998-10-19’) & (8 – 1) = 1998 & 7 = 6; N = num则继续计算N = 6 & ceiling(8 / 2) = 6 & 4 = 4;将其插入第4个分区
KEY分区
与hash分区区别在于hash函数由mysql提供:mysql cluster采用MD5(),其他存储引擎各自使用基于password()d的hash算法;分区列必须为主键的一部分,且不局限于整数类型;支持linear key分区;
子分区
对于range/list分区表,mysql支持包括key/hash在内的子分区
如何处理NULL
若分区列出现null,则其比任何non-null值都要小;
对于range分区表,分区列为null的行总是插入第一个分区;
对于list分区表,除非分区list值显示指定了null,否则插入失败;
对于hash/key分区表,null被当作0处理;