8000 43 | 要不要使用分区表? · Issue #56 · git-zjx/git-zjx.github.io · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
43 | 要不要使用分区表? #56
Open
@git-zjx

Description

@git-zjx

分区表的概念

分区表指的是逻辑上是一张表,但物理存储根据规则存放在不同的文件中。

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 文件
image
也就是说,对于引擎层,这是四个表;对于 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 语句删除数据相比,优势是速度快、对系统影响小

分区表的基本类型

分区表基本类型

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    0