确认mysql是否支持分区表
show plugins;
如果结果出现partition 的 status 为 ACTIVE,则说明支持,如果不支持,请重新编译安装mysql
mysql分区表的特点
在逻辑上为一个表,但在物理上存储在多个文件
非分区表有两个文件.frm、.ibd,数据文件和建表文件
分区表有一个.frm文件,多个.ibd文件,如
table_name#P#p0.ibd
table_name#P#p1.ibd
table_name#P#p2.ibd
table_name#P#p3.ibd
创建mysql数据表为hash表
#省略普通建表语句,在后边加上
PARTITION BY HASH(customer_id) PARTITIONS 4;
常用mysql分区的类型
1、按HASH分区
根据MOD(分区键,分区数)的值把数据航存储到表的不同分区内
数据可以平均的分布在各个分区
HASH分区的键值必须是一个INT类型的值,或者是通过函数可以转为INT类型
创建mysql数据表为hash分区表
在普通的建表语句后加上PARTITION BY HASH(field_name) PARTITIONS 4;其中字段类型必须为整型。
如果字段类型为TIMESTAMP型,则可以通过PARTITION BY HASH(UNIX_TIMESTAMP(field_name)) PARTITIONS 4;来进行分区建立。
2、按RANGE分区
根据分区键值的范围把数据行存储到表的不同分区中
多个分区的范围要连续,但是不能重叠
默认情况下使用VALUES LESS THAN属性,既每个分区不包括指定的那个值
创建mysql数据表为range分区表
PARTITION BY RANGE (field_name)(
PARTITION p0 VALUES LESS THAN (10000),
PARTITION p1 VALUES LESS THAN (20000),
PARTITION p2 VALUES LESS THAN (30000),
PARTITION p3 VALUES LESS THAN MAXVALUE #如果没有此分区,则插入40000的时候会报错
);
range分区的使用场景
分区键为日期或是时间类型
所有查询中都包括分区键
定期按分区范围清理历史数据
3、按LIST分区的特点
按分区键取值的列表进行分区
同范围分区一样,各分区的列表值不能重复
每一行数据必须恩那个找到对于的分区列表,否则数据插入失败
创建mysql数据表为list分区表
PARTITION BY LIST (field_name) (
PARTITION p0 VALUES in (1,3,5,7,9),
PARTITION p1 VALUES in (2,4,6,8)
);
#插入10,会报错
分区表在日志类表中的应用
1、使用range分区
2、以login_time(登录时间)作为分区键
3、创建语句,在建表语句后加,按年分区
PARTITION BY RANGE (YEAR(login_time)) (
PARTITION p0 VALUES LESS THAN (2015),
PARTITION p1 VALUES LESS THAN (2016),
PARTITION p2 VALUES LESS THAN (2017)
);
4、查看分区使用情况
SELECT table_name,partition_name,partition_description,table_rows FROM information_schema.'partitions' WHERE table_name='分区表名';
5、注意事项
为了避免插入数据到range分区失败,要做修改并添加分区的计划任务
6、添加分区
ALTER TABLE table_name ADD PARTITION (PARTITION p4 LESS THAN (2018));
7、删除过期数据(p0)、如果用delete,则非常耗时并且会锁定。
ALTER TABLE table_name DROP PARTITION p0;
8、过期数据归档
要求:
mysql>=5.7、表结构相同、归档到的数据表一定要是非分区表、非临时表且不能有外键约束、归档引擎是archive
步骤
建立一个和分区表结构相同的非分区表,引擎改为archive
ALTER TABLE table_name exchange PARTITION p1 WITH TABLE archive_table_name;#执行归档交换迁移
完成迁移后,将迁移的分区进行删除,参考第7条
9、注意事项
结合业务场景选择分区键,避免跨分区查询
对分区表进行查询最好在where从句中包含分区键,以利用分区加快效率
具有主键或唯一索引的表,主键或唯一索引必须是分区键的一部分,所以比较适用于myisam引擎
DB规划
1、为以后数据库迁移提供方便,能够方便的拆分数据库
2、避免跨库操作,把经常一起关联查询的表放到一个DB中
3、为了方便识别表所在的DB,在表明前增加库名前缀。