MySQL分区表

确认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,在表明前增加库名前缀。
    原文作者:猪肉楠
    原文地址: https://www.jianshu.com/p/abc375dbf783
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞