Open
Description
分区表的概念
分区表指的是逻辑上是一张表,但物理存储根据规则存放在不同的文件中。
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);
这里创建了一个分区表,这个表包含了一个 frm 文件和四个 ibd 文件,每个分区对应一个 .ibd 文件
也就是说,对于引擎层,这是四个表;对于 Server 层,这是一个表
分区表的引擎层行为
对于 InnoDB 引擎,间隙锁的加锁范围会缩小到单独的分区表
对于 MyISAM 引擎,表锁只会锁住对应的分区,其他分区查询不受影响
这里的行为其实和手工分表是一致的,因为对于引擎层来说都是多个表
分区策略
MyISAM 分区表使用通用分区策略(generic partitioning),每次访问分区都由 server 层控制。当分区表第一次被访问时,无论该次访问需要操作多少个分区,都需要访问该分区表上所有分区,导致性能问题。当分区表上分区数量较大时,可能会因为打开文件数量超过参数open_file_limit限制而出错
从 MySQL 5.7.9 开始,InnoDB 引擎引入了本地分区策略(native partitioning)。这个策略是在 InnoDB 内部自己管理打开分区的行为
分区表的 server 层行为
在 server 层,认为分区表是一张表,因此所有分区共用一个 MDL 锁
分区表的应用场景
分区表显而易见的优势是对业务透明,并且可以很方便的清理历史数据。可以通过 alter table t drop partition …操作直接删除分区文件,效果跟 drop 普通表类似。与使用 delete 语句删除数据相比,优势是速度快、对系统影响小
分区表的基本类型