1.什么是分区表?
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);
insert into t values('2017-4-1',1),('2018-4-1',1);
这个表在系统的存储上包含1个.frm文件和4个.ibd文件,每个分区对应一个.ibd文件。也就是说:
- 对于引擎层来说,这是4个表;
- 对于Server层来说,这是1个表;
2.分区表对引擎层的处理有什么影响?
分区表可以把锁的粒度控制在分区中。
分区表和手工分表的区别在于一个是由server层来决定使用哪个分区,一个是由应用层代码来决定使用哪个分表。
从server层的角度看,分区表有一个广为诟病的问题:打开表的行为。
3.分区策略
每当第一次访问一个分区表的时候,mysql需要把所有分区都访问一遍。如果表的分区很多,会导致打开表文件的个数超过上限而报错。这个问题只会在MyISAM引擎上出现。
MyISAM引擎使用的分区策略是通用分区策略,比较粗糙,每次访问分区都由server层控制。
InnoDB引擎引入了本地分区策略,在InnoDB内部自己管理打开分区的行为。
4.分区表的server行为
从server层来看的话,一个分区表就只是一个表,所有分区共用同一个MDL锁。
网友评论