Mysql 表分区

1.Mysql 分区

数据分散存储在一张表不同的物理文件中,分区不会改变表结构,发生变化的是存储方式,数据的访问不需要用户去指定,维护轻松,应用层不需改动,表的索引会和分区分配到磁盘中不同的位置

2.Mysql 表分区和索引的关系,性能依次降低

  • 主键分区:主键分区即字段是主键同时也是分区字段,性能最好。
  • 部分主键+分区索引: 使用组合主键里面的部分字段作为分区字段,同时将分区字段建索引。
  • 分区索引:没有主键,只有分区字段且分区字段建索引。
  • 分区+分区字段没有索引:只建了分区,但是分区字段没有建索引。

3.Mysql RANGE分区类型

参考在线文档:http://tool.oschina.net/apidocs/apidoc?api=mysql-5.1-zh 按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义,案列:对温湿度记录明细表改为表分区sql语句,根据表(T_TEMP_RECORD_DETAIL 中字段:op_time)以年份为基准进行表分区。

alter table T_TEMP_RECORD_DETAIL
partition by range(year(op_time))(
partition  p2019 values less than(2019),
partition  p2020 values less than(2020),
partition  p2021 values less than(2021),
partition  p2022 values less than(2022),
partition  p2023 values less than(2023),
partition  p2024 values less than(2024),
partition  p2025 values less than(2025),
partition  p2026 values less than(2026),
partition p_des VALUES LESS THAN MAXVALUE
 );

字段op_time 必须为正确的时间类型,非空,否则在分区中没有针对该字段为空时的存储分区。

4.RANGE 分区数据的存放

  • 使用range 分区后 年份小于2019的数据会存储在p2019 分区中,年份大于2019 小于2020的数据会自动存储在p2020 分区中。

5.RANGE 分区数据的删除

“Alter table T_TEMP_RECORD_DETAIL drop partition p2019 “

运行sql 来删除某一个分区来删除数据

6.RANGE 分区数据的查询

Select * from T_TEMP_RECORD_DETAIL where op_time>=’2018-1-1 00:00:00’ and 
op_time<=’2019-12-31 23:59:59’

这里sql优化器会只查询 p2019 分区中的数据,查询效率提升。

7.RANGE 分区的增加

  • 必须先删除最大分区:
alter table T_TEMP_RECORD_DETAIL drop partition p_des;
  • 新增分区:
alter table T_TEMP_RECORD_DETAIL add partition(partition p_2027 values less than(2027));

8.RANGE 分区的删除

alter table T_TEMP_RECORD_DETAIL drop partition p2019;

删除该分区后,分区中的数据也会被删除。

猜你喜欢

转载自my.oschina.net/loveorange/blog/1625396