确认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)); 就可以解决
感谢博主,喝杯咖啡~
感谢博主,喝杯咖啡~
当你觉得自己又丑又穷,一无是处时,别绝望,因为至少你的判断还是对的。