欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL分区表

程序员文章站 2022-06-02 08:57:13
...

确认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,在表明前增加库名前缀。