mysql--分区表

分区表:

        底层用多个物理子表组成。对于应用层来说可以不做变化,我们无需改变原有的SQL语句

        建表时使用PARTITION  BY定义每个分区存放的数据


适用场景:

        1.表很大无法全部放到内存中(查询的时候过滤掉一些分区,无需扫全表)
        2.更易于维护(删除的时候可以删除整个分区)
        3.分区表的数据可以分布在不同物理设备上,可以高效的利用多个硬件设备
        4.备份,恢复独立的分区。这在非常大的数据集的场景下效果非常好


原理:

        打开并锁住所有的底层表,优化器判断可过滤的分区,继而进行增删改查


分区表类型:

        PARTITION  BY  RANGE:根据范围分区,范围应该连续但是不重叠。 

mysql--分区表_第1张图片

        PARTITION  BY  LIST:基于枚举值分区

mysql--分区表_第2张图片

        PARTITION  BY  HASH:整数列对分区数取模

mysql--分区表_第3张图片

        PARTITION  BY  KEY:

mysql--分区表_第4张图片

使用策略:

        1. 全量扫描数据,不要任何索引(注意null值会到第一个分区中)
        2. 索引数据,并分离热点


分区的管理:

    删除分区:(如果删除了分区,那么分区下面的数据也会被删除)

        alter table 表名 drop partition 分区名

    新建分区:

        alter table 表名 add partition (partition 分区名字 values less than(某个具体值))

    修改现有表分区:

        alter table 表名

            PARTITION BY RANGE (字段)

            (PARTITION p0 VALUESLESS THAN (200000),

            PARTITION p1 VALUESLESS THAN (400000) ,

            PARTITION pmax VALUESLESS THAN MAXVALUE );


注意:

        1 只有在where条件中加入分区列才能起到作用,过滤掉不需要的分区:

        2 与普通搜索一样,在运算符左侧使用函数将使分区过滤失效,即使与分区函数相同也一样:


合并表(早期简单的分区实现):

        合并表相当于一个容器,里面包含了多个真实表。

mysql--分区表_第5张图片

你可能感兴趣的:(mysql--分区表)