分享按钮

MYSQL 分区表

MYSQL / 2065人浏览 / 0人评论

确认MYSQL服务器是否支持分区表

mysql> show plugins;

mysql分区表的特点

在逻辑上为一个表,在物理上存储在多个文件中

按HASH分区(HASH)

hash分区的特点

1)根据MOD(分区键,分区数)的值把数据行存储到表的不同分区中

2)数据可以平均的分布在各个分区中

3)hash分区的键值必须是一个int类型的值,或是通过函数可以转为INT类型

create table customer_login_log(

customer_id int unsigned NOT NULL,

login_time timestamp,

login_ip int  unsigned,

login_type tinyint not null

) partition by hash (login_ip) partitions 6; 以login_ip 为键值分6张表


可以看到customer_login_log 物理文件存储

           2, 按范围分区(RANGE)

RANGE 分区特点

1)根据分区键值的范围把数据行存储到表的不同分区中

2)多个分区的范围要连续,但是不能重叠

3)默认情况下使用 values less than 属性 ,即每个分区不包括指定的那个值

如何建立RANGE分区

create table customer_login_log(

customer_id int unsigned NOT NULL,

login_time timestamp,

login_ip int  unsigned,

login_type tinyint not null

) ENGINE=INNODB

PARTITION BY RANGE (customer_id)(

PARTITION p0 values less than (10000),#0-9999

PARTITION p1 values less than (20000),#10000-19999

PARTITION p2 values less than (30000),#20000-29999

PARTITION p3 values less than maxvalue   #>30000  ,如果没有建立p3 分区 数据大于 P2后就会报错

); 

RANGE分区的适用场景

1)分区键为日期或是时间类型

2)所有查询中都包括分区键

3)定期按分区范围清理历史数据


        LIST分区

LIST分区的特点

1)按分区键取值的列表进行分区

2)同范围分区一样,各分区的列表不能重复

3)每一行数据必须能找到对应的分区列表,否则数据插入失败

如何建立LIST分区

create table customer_login_log_list(

customer_id int unsigned NOT NULL,

login_time timestamp,

login_ip int  unsigned,

login_type tinyint not null

) ENGINE=INNODB

PARTITION BY LIST (login_type)(

PARTITION p0 values in (1,3,5,7,9),

PARTITION p1 values in (2,4,6,8)

);

如果插入 login_type=10, insert into customer_login_log_list

(customer_id,login_time,login_ip,login_type)

values(100,now(),1,10) 则会提示 table has no partition for value 10

                

                     这是 只要 在新增 ALTER TABLE customer_login_log_list  ADD PARTITION (PARTITION p2 VALUES IN (10)); 就可以解决



感谢博主,喝杯咖啡~