背景:当一个表的数据量到了百万,千万级别的时候,数据读取和数据的插入效率将会十分低下,如果还涉及到多表联查的话,效率惊人的低下。
1,分区:
<1>.概念:将数据表中的数据分段划分在不同的位置存放;位置可以是同一块磁盘,也可以是不同的磁盘或者不同的mysql服务器;分区之后,表面上还是一个表,但是数据散列在不同的位置上,对于磁盘的读取就会分离开来,减少了单个磁盘的I/O开销,这样就是提高数据库的性能;注意:mysql 分区会将null字段作为0或者最小的值进行处理。
<2>.类型:
《a》Range分区:基于一个给定的连续区间范围,把数据分配到不同的分区;区间要连续而且不同重叠,使用VALUES LESS THAN 操作进行定义;如
mysql > CREATE TABLE test (
-> id INT NOT NULL,
-> name CHAER NOU NULL,
-> age INT NOT NULL,
-> store_id INT NOT NULL
-> )
-> PARTITION BY RANGE (COLUMNS->适用于菲整数分区)(store_id)(
-> PARTITION p0 VALUES LESS THAN (10),
-> PARTITION p1 VALUES LESS THAN (20),
-> PARTITION p2 VALUES LESS THAN (30)
-> );
在建立好如上分区之后,我们可以用如下语句给store_id>30的数据建立第四个分区:
alter table test add partition (partition p4 VALUES LESS THAN MAXVALUE);
mysql 5.1之后还支持对于非整数分区,使用的是RANGE COLUMNS语句;
《b》List分区:类似于Range分区,区别在于List分区时基于枚举出的值列表分区,RANGE分区时基于给定的连续区间范围分区;使用PARTITION BY LIST 子句来实现,如下:
mysql > CREATE TABLE test (
-> id INT NOT NULL,
-> name CHAER NOU NULL,
-> age INT NOT NULL,
-> store_id INT NOT NULL
-> )
-> PARTITION BY LIST (store_id)(
-> PARTITION p0 VALUES IN (3,5),
-> PARTITION p1 VALUES IN (20,6),
-> PARTITION p2 VALUES IN (2,8)
-> );
但是LIST分区必须注意的是必须能在in里面匹配到数据,否则会报错;这个区别于RANGE分区;
《c》Colunns分区:只能适用于mysql5.5之后,其实这个分区主要是解决RANGE 和 LIST分区不能使用非整形数据列进行分区而产生的,但是他的功能不仅仅如此;因为他还支持多列分区;如下
mysql > CREATE TABLE test (
-> a INT NOT NULL,
-> b INT NOU NULL
-> )
-> PARTITION BY RANGE COLUMNS (a,b)(
-> PARTITION p1 VALUES LESS THAN (20,20),
-> PARTITION p2 VALUES LESS THAN (30,15)
-> PARTITION p2 VALUES LESS THAN (10,MAXVALUE),
-> PARTITION p2 VALUES LESS THAN (MAXVALUE,MAXVALUE)
-> );
《d》Hash分区:主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分配,当我们对一个数据表分区的时候,mysql会对分区键应用一个散列函数,以此来确定数据应当放在N个分区的哪个分区中。mysql支持两种hash分区,常规分区和线性分区,常规分区使用的是取模算法,线性分区使用的是一个线性的2的幂的运算法则。分区如下:
mysql > CREATE TABLE test (
-> id INT NOT NULL,
-> name CHAER NOU NULL,
-> age INT NOT NULL,
-> store_id INT NOT NULL
-> )
-> PARTITION BY(LINEAR:线性分区) HASH(store_id) PARTITION 4;
该分区会将数据表store_id字段根据取模算法获取2的幂的运算分为4个分区;
《e》Key分区:类似于HASH分区,不同之处在于HASH分区可以使用自己的表达式,而key分区只能使用mysql服务器提供的hash函数,同时hash分区只支持整数类型,但是key分区支持除了blob和text类型之外的所有字段类型;如下:
mysql > CREATE TABLE test (
-> id INT NOT NULL,
-> name CHAER NOU NULL,
-> age INT NOT NULL,
-> store_id INT NOT NULL
-> )
-> PARTITION BY KEY (LINEAR:线性分区)(store_id) PARTITION 4;
同时key分区你可以不指定分区键,默认会使用主键进行分区,如果没有主键,会使用非空唯一键作为分区键。线性分区类似于hash分区,但是如果数据表没有主键也没有非空唯一键那就必须指定分区键。
《e》子分区:就是在分区的基础上在进行一次分区,又称为复合分区;