MySQL分区 – 概述

引言

MySQL的分区方案可以将一个表中的数据分别保存到不同的位置。用户用来分区的规则被称为分区函数。分区函数可以是模运算函数,数值List集合匹配,内置的hash函数或者线性Hash函数。用户可以按照自己的需要选择分区函数,并为分区函数提供一个参数表达式。这个参数表达式可以是一个字段的值,也可以是面向一个或多个字段的函数运算,也可以是一个或多个字段的值的集合,这取决于用户选择的分区方案。

MySQL的分区方案是一种水平分区方案,也就是说一个表中的行可以被分发到不同的物理分区。MySQL5.6暂时还不支持垂直分区。

要判断使用的MySQL是否支持分区可以在MySQL命令行中使用“SHOW PLUGINS;”语句查询MySQL中的插件。如果查询结果中有partition插件,且Status为Active,那么可以执行分区。这个信息也可以查询表INFORMATION_SCHEMA.PLUGINS得到。

分区和存储引擎

在创建分区表的时候,可以使用MySQL支持的大部分存储引擎。MySQL的分区引擎运行在一个独立的层面上,可以与任何存储引擎自由交互。在MySQL5.6中,一个分区表的所有分区的存储引擎必须是一致的。举个例子:对于同一个表,不允许这个表的一个分区的引擎是MyIsam,而另一个分区的引擎是Innodb。

在使用MERGE, CSV, 或者FEDERATED存储引擎的时候,不可以使用分区。

NDB存储引擎只支持KEY或LINEAR KEY分区方案。

在建表语句中,存储引擎的声明要在分区声明语句前面。如下:

需要注意的点

分区作用于一个表的全部数据上,不可能只对数据分区而不对索引分区,反过来也是的。同样,也不可能只对一个表的部分数据进行分区。

在建表时,可以在分区声明语句中使用DATA DIRECTORY和INDEX DIRECTORY将数据或索引保存到指定的目录。如果分区表使用的是MyIsam引擎,DATA DIRECTORY和INDEX DIRECTORY在windows系统上的表并不适用。如果使用的是Innodb引擎,则全平台都可以使用。

在一个表的分区表达式中使用的字段必须是这个表的全部唯一键(包括主键)的一部分。这就意味着使用如下语句创建的表不能被分区:

因为主键pk和唯一键uk并没有交集,这就意味着没有任何字段可以用在分区表达式中。

补充一点,如果表中没有主键或唯一键,可以取任意字段用在分区表达式中。

此外,可以使用MAX_ROWS和MIN_ROWS来限制每个分区中保存的记录的最大数量和最小数量。

使用分区的优势

使用分区有如下优势:

  • 可以突破硬盘或文件系统分区的限制,存储更多的数据;
  • 采用删除分区的方式可以轻松地从一个分区表中删除无用的数据,同样也可以创建新的分区来保存新的数据;
  • 在执行查询时,如果在where子句中查询的记录保存在一个或少数几个分区上,查询的效率将会得到极大的提升;MySQL5.6也支持在查询语句中指定要查询的分区,如

还有一些关于分区的好处,MySQL现在并不支持,但是是可以期待的:

  • 在使用聚集函数时,函数的运算可以在同时在几个分区上并发执行;
  • 可以同时从多个硬盘检索数据,得到更大的吞吐量。

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.