MySQL从5.1版本开始支持分区功能,它允许可设置的一定逻辑,跨文件系统分配单个表的多个部分,但是就访问数据库而言,逻辑上还是只有一个表。
还是老样子,在学习新知识之前都先带着问题去寻找想要的答案:
1、什么是分区?
2、为什么分区?好处在哪?
3、如何分区?
什么是MySQL分区?
一开始也讲了,根据一定逻辑规则,将一个表拆成多个更小更容易管理的部分。例如我们新建一张表利用range分区
逻辑上还是只有一张表,但是实际上确有3个物理分区对象组成
我们查看是否支持分区时对于5.6以下的版本可以使用如下命令:
show variables like '%partition%';
而在5.6及以上用如上命令会显示empty set,但是并不是表示不支持分区,而是我们应该这样查看:
show plugins;
当看到有partition并且status是active时表示支持。
为什么分区?
1、分区可以在一个表中存储比单个磁盘或文件系统分区上的数据更多的数据,因为我们可以将分区表存储在不同物理磁盘上
2、对已过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据,他的效率远比delete高;
3、优化查询,在where子句中包含分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率;例如下面语句:
SELECT * FROM t PARTITION(p0,p1)WHERE c <5仅选择与WHERE条件匹配的分区p0和p1中的那些行。
在这种情况下,MySQL不检查表t的任何其他分区;
4、涉及聚合函数SUM()、COUNT()的查询时,可以容易的在每个分区上并行处理,例如在执行下面这条语句:
SELECT salesperson_id,COUNT(orders)as order_total FROM sales GROUP BY salesperson_id ;会在每个分区上都同时运行查询;
5、凭借在多个磁盘上传播数据,实现更高的查询吞吐量。
说这么多好处,也说一下它的缺点吧:
1、一个表最多只能有1024个分区;
2、在MySQL5.1中,分区表达式必须为整数或者返回整数,而在MySQL5.5以后可以使用非整数,即其他的数据类型(并不是所有的数据类型)来分区;
3、同一个分区表的所有分区必须使用相同存储引擎;
4、分区表无法使用外键约束;
> 1506 - Foreign keys are not yet supported in conjunction with partitioning
如何分区?
有以下四种分区类型:
RANGE分区:基于一个给定连续区间范围,把数据分配到不同的分区;
LIST分区:类似RANGE分区,区别在LIST分区是基于枚举出的值列表分区,RANGE是基于给定连续区间范围分区;
HASH分区:基于用户定义的表达式返回值来选择分区,该表达式对要插入到表的行中列值操作;
KEY分区:类似HASH,但是HASH允许使用用户自定义表达式,而KEY分区不允许,它需要使用MySQL服务器提供的HASH函数,同时HASH分区只支持整数分区,而KEY分区支持除BLOB和TEXT类型外其他列;
但是无论是哪一种分区类型,要么分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,否则会报错: