mysql之分区表小结1

同一表的所有分区必须使用同一个的存储引擎

 

如何禁止分区

启动服务器时指定—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()dhash算法;分区列必须为主键的一部分,且不局限于整数类型;支持linear key分区;

 

子分区

对于range/list分区表,mysql支持包括key/hash在内的子分区

 

如何处理NULL

若分区列出现null,则其比任何non-null值都要小;

对于range分区表,分区列为null的行总是插入第一个分区;

对于list分区表,除非分区list值显示指定了null,否则插入失败;

对于hash/key分区表,null被当作0处理;

请使用浏览器的分享功能分享到微信等