分区表:
底层用多个物理子表组成。对于应用层来说可以不做变化,我们无需改变原有的SQL语句
建表时使用PARTITION BY定义每个分区存放的数据
适用场景:
1.表很大无法全部放到内存中(查询的时候过滤掉一些分区,无需扫全表)
2.更易于维护(删除的时候可以删除整个分区)
3.分区表的数据可以分布在不同物理设备上,可以高效的利用多个硬件设备
4.备份,恢复独立的分区。这在非常大的数据集的场景下效果非常好
原理:
打开并锁住所有的底层表,优化器判断可过滤的分区,继而进行增删改查
分区表类型:
PARTITION BY RANGE:根据范围分区,范围应该连续但是不重叠。
PARTITION BY LIST:基于枚举值分区
PARTITION BY HASH:整数列对分区数取模
PARTITION BY KEY:
使用策略:
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 与普通搜索一样,在运算符左侧使用函数将使分区过滤失效,即使与分区函数相同也一样:
合并表(早期简单的分区实现):
合并表相当于一个容器,里面包含了多个真实表。