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);
如果用这个sql创建分区表,可以看到有一个.frm文件和4个.ibd文件,对于引擎来说是4个表,对于server来说的是1个表;
这里是范围分区,mysql还支持hash分区,list分区等,其他分区可参考mysql手册:https://dev.mysql.com/doc/refman/8.0/en/partitioning-types.html
2.分区表的特点:
- MySQL 在第一次打开分区表的时候,需要访问所有的分区;
- 在 server 层,认为这是同一张表,因此所有分区共用同一个 MDL 锁;
- 在引擎层,认为这是不同的表,因此 MDL 锁之后的执行过程,会根据分区表规则,只访问必要的分区。
3.分区策略:通用分区策略;本地分区策略;
MyISAM分区表使用通用分区策略,每次访问都有server层控制,通用分区策略,是 MySQL 一开始支持分区表的时候就存在的代码,在文件管理、表管理的实现上很粗糙,因此有比较严重的性能问题。
MySQL 从 5.7.17 开始,将 MyISAM 分区表标记为即将弃用,从 MySQL 8.0 版本开始,就不允许创建 MyISAM 分区表了,只允许创建已经实现了本地分区策略的引擎。目前来看,只有 InnoDB 和 NDB 这两个引擎支持了本地分区策略。
从 MySQL 5.7.9 开始,InnoDB 引擎引入了本地分区策略(native partitioning)。这个策略是在 InnoDB 内部自己管理打开分区的行为。
4.什么时候应该用?什么时候应该不用?
- 对业务透明,业务代码更简洁;
- 删除历史数据更方便;alter table t drop partition ... 操作是直接删除分区文件,效果跟 drop 普通表类似。与使用 delete 语句删除数据相比,优势是速度快、对系统影响小。
5.MDL锁是什么锁?
MDL全称为metadata lock,即元数据锁。 MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作。 因此从MySQL5.5版本开始引入了MDL锁,来保护表的元数据信息,用于解决或者保证DDL操作与DML操作之间的一致性。
DDL:对数据库中的某些对象 (例如,database,table)进行管理,如Create,Alter和Drop。
DML:DML操作 对数据库中的数据进行一些简单操作,如insert,delete,update,select等。