MySQL 数据库在 5.1 版本时添加了对分区(partitioning)的支持。分区的过程是将一个表或索引分解成多个更小、更可管理的部分。就访问数据库的应用而言,从逻辑上来说,只有一个表或一个索引,可是在物理上这个表或索引可能由数十个物理分区组成。算法
MySQL 分区功能并非在存储引擎层完成的,所以不是只有 InnoDB 存储引擎支持分区,常见的存储引擎 MyISAM、NDB 等都支持。数据库
MySQL 数据库支持的分库类型为水平分区(指将同一表中不一样行的记录分配到不一样的物理文件中),并不支持垂直分区(指将同一表中不一样列的记录分配到不一样的物理文件中)。函数
MySQL 数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引。而全局分区是指,数据存放在各个分区中,可是全部数据的索引放在一个对象中。MySQL 数据库目前不支持全局分区。性能
MySQL 查看数据库分区。设计
SHOW VARIABLES LIKE '%partitions%';
MySQL 数据库支持如下几种类型的分区。1 若是表中存在主键/惟一索引时,分区列必须是主键/惟一索引的一个组成部分。2 对于 RANGE、LIST、HASH 和 KEY 这四种分区中,分区的条件是:数据必须是整型,若是不是整型,那应该须要经过函数将其转化为整型,如 YEAR(),TO_DAYS(),MONTH() 等函数。code
子分区(subpartitioning)是在分区的基础上再进行分区,有时也称为这种分区为复合分区(composite partitioning)。MySQL 数据库容许在 RANGE 和 LIST 的分区上再进行 HASH 或 KEY 的子分区。进行子分区后,分区的数量应该为(分区数量 X 子分区数量)个。对象
MySQL 数据库容许对 NULL 值作分区,视 NULL 值小于任何一个非 NULL 值(和 ORDER BY 处理 NULL 值的规则一致)。blog
对于 OLAP(在线分析处理) 的应用,分区的确是能够很好地提升查询的性能,由于 OLAP 应用大多数查询须要频繁地扫描一张很大的表。假设有一张 1 亿行的表,其中有一个时间戳属性列。用户的查询依据时间为维度,若是按照时间戳进行分区,则只须要扫描对应的分区便可。索引
对于 OLTP(在线事务处理)的应用,一般不可能会获取一张大表中 10% 的数据,大部分都是经过索引返回几条记录便可。所以分区应该很是当心,对于一张大表,通常的 B+ 树须要 2~3 次 IO 就能检索到数据。经过根据主键 ID 作 10 个 HASH 的分区后,对于查询就须要扫描全部的 10 个分区,这无疑加剧了 IO 的负担。事务
咱们经过 Navicat 来操做下数据库分区,表 -> 右键点击'设计表' -> 选项 -> 分割区,能够看到以下内容。
来看看分区后,磁盘中 MySQL 数据库是怎么存储的。
经过 EXPLAIN 分析数据检索的分区。
EXPLAIN PARTITIONS SELECT * FROM t_materiel_config