前言:html
分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。可是对于应用程序来说,分区的表和没有分区的表是同样的。换句话来说,分区对于应用是透明的,只是数据库对于数据的从新整理。本篇文章给你们带来的内容是关于MySQL中分区表的介绍及使用场景,有须要的朋友能够参考一下,但愿对你有所帮助。mysql
MySQL在建立表的时候能够经过使用PARTITION BY
子句定义每一个分区存放的数据。在执行查询的时候,优化器根据分区定义过滤那些没有咱们须要的数据的分区,这样查询就能够无需扫描全部分区,只须要查找包含须要数据的分区便可。sql
分区的另外一个目的是将数据按照一个较粗的粒度分别存放在不一样的表中。这样作能够将相关的数据存放在一块儿,另外,当咱们想要一次批量删除整个分区的数据也会变得很方便。数据库
下面简单介绍下四种常见的分区类型:设计模式
上述四种分区类型中,RANGE分区
即范围分区是最经常使用的。RANGE分区的特色是多个分区的范围要连续,可是不能重叠,默认状况下使用VALUES LESS THAN属性,即每一个分区不包括指定的那个值。服务器
本节内容以RANGE分区为例,介绍下分区表相关的操做。less
# 建立分区表
mysql> CREATE TABLE `tr` (
-> `id` INT,
-> `name` VARCHAR(50),
-> `purchased` DATE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
-> PARTITION BY RANGE( YEAR(purchased) ) (
-> PARTITION p0 VALUES LESS THAN (1990),
-> PARTITION p1 VALUES LESS THAN (1995),
-> PARTITION p2 VALUES LESS THAN (2000),
-> PARTITION p3 VALUES LESS THAN (2005),
-> PARTITION p4 VALUES LESS THAN (2010),
-> PARTITION p5 VALUES LESS THAN (2015)
-> );
Query OK, 0 rows affected (0.28 sec)
# 插入数据
mysql> INSERT INTO `tr` VALUES
-> (1, 'desk organiser', '2003-10-15'),
-> (2, 'alarm clock', '1997-11-05'),
-> (3, 'chair', '2009-03-10'),
-> (4, 'bookcase', '1989-01-10'),
-> (5, 'exercise bike', '2014-05-09'),
-> (6, 'sofa', '1987-06-05'),
-> (7, 'espresso maker', '2011-11-22'),
-> (8, 'aquarium', '1992-08-04'),
-> (9, 'study desk', '2006-09-16'),
-> (10, 'lava lamp', '1998-12-25');
Query OK, 10 rows affected (0.03 sec)
Records: 10 Duplicates: 0 Warnings: 0
复制代码
建立后能够看到,每一个分区都会对应1个ibd文件。上面建立语句仍是很好理解的,在此分区表中,经过YEAR函数取出DATE日期中的年份并转化为整型,年份小于1990的存储在分区p0中,小于1995的存储在分区p1中,以此类推。请注意,每一个分区的定义顺序是从最低到最高。为了防止插入的数据因找不到相应分区而报错,咱们应该及时建立新的分区。下面继续展现关于分区维护的其余操做。函数
# 查看某个分区的数据
mysql> SELECT * FROM tr PARTITION (p2);
+------+-------------+------------+
| id | name | purchased |
+------+-------------+------------+
| 2 | alarm clock | 1997-11-05 |
| 10 | lava lamp | 1998-12-25 |
+------+-------------+------------+
2 rows in set (0.00 sec)
# 增长分区
mysql> alter table tr add partition(
-> PARTITION p6 VALUES LESS THAN (2020)
-> );
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 拆分分区
mysql> alter table tr reorganize partition p5 into(
-> partition s0 values less than(2012),
-> partition s1 values less than(2015)
-> );
Query OK, 0 rows affected (0.26 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 合并分区
mysql> alter table tr reorganize partition s0,s1 into (
-> partition p5 values less than (2015)
-> );
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 清空某分区的数据
mysql> alter table tr truncate partition p0;
Query OK, 0 rows affected (0.11 sec)
# 删除分区
mysql> alter table tr drop partition p1;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 交换分区
# 先建立与分区表一样结构的交换表
mysql> CREATE TABLE `tr_archive` (
-> `id` INT,
-> `name` VARCHAR(50),
-> `purchased` DATE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.28 sec)
# 执行exchange交换分区
mysql> alter table tr exchange PARTITION p2 with table tr_archive;
Query OK, 0 rows affected (0.13 sec)
复制代码
其实分区表的使用有不少限制和须要注意的事项,参考官方文档,简要总结几点以下:性能
从上面的介绍中能够看出,分区表适用于一些日志记录表。这类表的特色是数据量大、而且有冷热数据区分,能够按照时间维度来进行数据归档。这类表是比较适合使用分区表的,由于分区表能够对单独的分区进行维护,对于数据归档更方便。学习
在咱们项目开发中,分区表实际上是不多用的,下面简单说明下几点缘由:
总结:
本文较为详细的介绍了MySQL分区相关内容,若是想使用分区表的话,建议提前作好规划,在初始化的时候即建立分区表并制定维护计划,使用得当仍是比较方便的,特别是有历史数据归档需求的表,使用分区表会使归档更方便。固然,关于分区表的内容还有不少,有兴趣的同窗能够找找官方文档,官方文档中有大量示例。
参考: