数据库分区操作

       背景:当一个表的数据量到了百万,千万级别的时候,数据读取和数据的插入效率将会十分低下,如果还涉及到多表联查的话,效率惊人的低下。

      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 p0 VALUES LESS THAN (0,10),

           ->        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》子分区:就是在分区的基础上在进行一次分区,又称为复合分区;


    

   


      

   

     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值