《MySQL——分区表小记》

212 阅读2分钟

分区表的组织形式

以年份为分割方式,对表进行分割:

CREATE TABLE `t` (
  `ftime` datetime NOT NULL,
  `c` int(11) DEFAULT NULL,
  KEY (`ftime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
PARTITION BY RANGE (YEAR(ftime))
(PARTITION p_2017 VALUES LESS THAN (2017) ENGINE = InnoDB,
 PARTITION p_2018 VALUES LESS THAN (2018) ENGINE = InnoDB,
 PARTITION p_2019 VALUES LESS THAN (2019) ENGINE = InnoDB,
PARTITION p_others VALUES LESS THAN MAXVALUE ENGINE = InnoDB);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXl2g6NP-1617946354787)(C:\Users\LENOVO\AppData\Roaming\Typora\typora-user-images\1617944262057.png)]

现在插入两行记录:

insert into t values('2017-4-1',1),('2018-4-1',1);

这两行记录分别被放置在p_2018和p_2019分区上。

对于引擎层,这是四个表;对于server层,这是一个表

需要注意以下几点:

1、MySQL在第一次打开分区表时,需要访问所有的分区

2、sever层,认为是同一张表,因此所有分区共用同一个MDL锁

3、引擎层,认为是不同的表,因此MDL锁之后的执行过程,会根据分区表规则,只访问必要的分区

分区表应用场景

分区表优势:对业务透明,相对于用户分表来说,使用分区表的业务代码更简洁。

如果有一个长时间业务,有一个根据时间删除历史数据的需求。此时,按照时间分区的分区表,就可以直接通过alter table t drop partition 语句删掉分区,从而删掉过期的历史数据。

分区表使用注意点

1、分区并不是越细越好。

2、分区不要提前预留太多,在使用之前预先创建即可。对于没有数据的历史分区要及时drop

3、查询需要跨多个分区取数据,查询性能下降。