前言:

  查了下资料,关于 MySQL 分区的博文讲的详细的比较少,也不全,只好在官网去翻译英文文章看了。大体整理了一下记录起来;

  MySQL 分区类型:

  1、RANGE 分区;

    // 这种类型的分区基于落在给定范围内的列值将行分配给分区。

  2、LIST 分区;

    // 与 RANGE 分区类似,除了根据匹配一组离散值之一的列来选择分区。

  3、COLUMNS 分区;

    // 提供对 LIST COLUMNS 分区的支持。这是一种LIST分区的变体 ,可以使用多列作为分区键,

    也可以使用不同于整数类型的数据类型列作为分区列; 您可以使用字符串类型 DATE和 DATETIME列。

  4、HASH 分区;

    // 使用这种类型的分区,将根据用户定义的表达式返回的值来选择分区,该表达式对要插入到表中的行中的列值进行操作。

    该函数可以由在 MySQL 中有效的表达式产生非负整数值的任何表达式组成。此类型的扩展 LINEAR HASH 也可用。

  5、KEY 分区;

    // HASH 除了只提供一个或多个要评估的列,MySQL 服务器提供了自己的散列函数之外, 这种类型的分区类似于分区 。

    这些列可以包含除整数值之外的列,因为 MySQL 提供的散列函数保证整数结果,

    而不管列数据类型如何。此类型的扩展 LINEAR KEY 也可用。

  6、Subpartitioning 分区;(子分区)

    // 子分区(也称为 复合分区)是分区表中每个分区的进一步划分。

一、RANGE 分区

  按范围分区的表以每个分区包含分区表达式值位于给定范围内的行分配。

  范围应该是连续的,但不重叠,并且使用 VALUES LESS THAN 运算符定义 。

  接下来的几个例子,假设您正在创建一个如下所示的表,以容纳 20 个视频存储区的人员记录,编号为1到20:

CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN MAXVALUE
);

  在这种分区方案中,对应于在存储1到5工作的员工的所有行都存储在分区中p0,存储在 存储器6到10中的那些被存储在分区中p1,依此类推;

  每个分区按顺序定义,从最低到最高。这是PARTITION BY RANGE语法的要求;

  MAXVALUE表示总是大于最大可能整数值的整数值(以数学语言,它用作 最小上限);

  // 也可以采用日期、等范围进行分区;

二、LIST 分区

  MySQL中的列表分区在很多方面类似于范围分区。在分区时RANGE,必须明确定义每个分区。

  两种类型的分区之间的主要区别在于,在列表分区中,每个分区根据一组值列表中的一列中的列值的成员资格而不是一组连续范围值。

  这是通过使用完成,其中 是基于列值的列值或者表达式并返回一个整数值,然后通过的手段限定每个分区 ,其中 是用逗号分隔的整数列表。

  语法:PARTITION BY LIST(expr)expr VALUES IN (value_list)value_list

  举例:假设在4个特许经营店中分配了20个视频商店,要以这样的方式对属于同一区域的商店的行存储在同一个分区中的方式进行分区;

CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY LIST(store_id) (
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);

  这样可以轻松地将与表中特定区域相关的员工记录添加或删除。例如,假设西部地区的所有商店都被卖给另一家公司。

  在该区域的商店工作的员工相关的所有行都可以通过查询删除 ALTER TABLE employees TRUNCATE PARTITION pWest

  这可以比等效 DELETE 语句更有效地执行 DELETE FROM employees WHERE store_id IN (4,12,13,14,18);

  (使用ALTER TABLE employees DROP PARTITION pWest也会删除所有这些行,但也会pWest从表的定义中删除分区 ;

  您需要使用ALTER TABLE ... ADD PARTITION语句来还原表的原始分区方案。)

  与RANGE分区一样,可以LIST通过哈希或密钥将分区与分区组合以产生复合分区(子分区)。

  // 如果插入不在 LIST 分区范围内的 id,者会报错:ERROR 1525 (HY000): Table has no partition for value 3

三、COLUMNS 分区

  所谓 COLUMNS 分区就是 RANGE COLUMNS 分区和 LIST COLUMNS 分区两种,在 RANGE、LIST 的基础上做的扩充;

  RANGE CLOUMNS:

    RANGE CLOUMNS 分区和 RANGE 分区类似,但可以使用基于多个列值的范围来定义分区。

    此外,还可以使用除整数类型之外的类型的列定义范围。

    RANGE COLUMNS分区与RANGE以下方式显着不同:

    #、RANGE COLUMNS 不接受表达式,只接受列的名称;

    #、RANGE COLUMNS 接受一个或多个列的列表;

       RANGE COLUMNS 分区基于元组(列值列表)之间的比较,而不是标量值之间的比较;

       RANGE COLUMNS 分区中行的放置也是基于元组之间的比较;

    #、RANGE COLUMNS分区列不限于整数列;字符串、DATE 和 DATETIME 列也可以用作分区列;

CREATE TABLE rcx (
a INT,
b INT,
c CHAR(3),
d INT
)
PARTITION BY RANGE COLUMNS(a,d,c) (
PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
PARTITION p1 VALUES LESS THAN (10,20,'mmm'),
PARTITION p2 VALUES LESS THAN (15,30,'sss'),
PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
);

  // 一般用的不会太多,不做太多了解,详情见:

  https://dev.mysql.com/doc/refman/8.0/en/partitioning-columns-range.html

  LIST COLUMNS:

  这是一种LIST分区的变体 ,可以使用多列作为分区键,也可以使用不同于整数类型的数据类型列作为分区列;

  举例:

  假设您有一个在12个城市有客户的业务,出于销售和营销目的,您可以组织到3个城市的4个地区;

CREATE TABLE customers_1 (
first_name VARCHAR(25),
last_name VARCHAR(25),
street_1 VARCHAR(30),
street_2 VARCHAR(30),
city VARCHAR(15),
renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Hogsby', 'Monsteras'),
PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Vastervik'),
PARTITION pRegion_3 VALUES IN('Nassjo', 'Eksjo', 'Vetlanda'),
PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Vaxjo')
);

  // 甚至在分区中可以使用这种的语法:PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03');  pWeek 为 DATE 数据类型;

四、HASH 分区

  HASH 分区主要用于确保在预定数量的分区之间均匀分配数据;基于分区个数的取模(%)运算。根据余数插入到指定的分区;

  要使用分区对表进行HASH分区,需要在 CREATE TABLE 语句附加一个子句,其中是返回一个整数的表达式。

  这可以只是一个列的名称,其类型是MySQL的整数类型之一。

  此外,您最有可能希望遵循这一点,其中 是一个正整数,表示要分割表的分区数。

  语法:PARTITION BY HASH (exprexpr PARTITIONS numnum

  

  以下语句创建一个表,该store_id列在列上使用散列, 并分为4个分区:  

CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;

  线性 HASH 分区:(没能明白,官方地址)

  https://dev.mysql.com/doc/refman/8.0/en/partitioning-linear-hash.html

五、KEY 分区

  按 键 划分类似于通过哈希分区,除了哈希分区采用用户定义的表达式之外,密钥分区的哈希函数由 MySQL 服务器提供。

  语法:CREATE TABLE ... PARTITION BY KEY

  类似于用于创建由哈希分区的表的语法规则。主要区别如下:

  #、KEY被使用而不是 HASH;

  #、KEY仅列出零个或多个列名称。用作分区键的任何列必须包含表的主键的一部分或全部,如果该表具有一个。

    如果没有列名称作为分区键,则使用表的主键(如果有)。  

CREATE TABLE k1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;

  必须定在主键之上,如果没有主键定义在唯一键列上,同理不允许为 NULL;

  

六、Subpartitioning 分区

  子分区(也称为 复合分区)是分区表中每个分区的进一步划分。

  举例:  

CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) )
SUBPARTITIONS 2 (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE
);

  表 ts 有 3 个 RANGE 分区。这些分区-中的每一个 p0,p1和 p2-is 进一步分成2子分区。实际上,整个表分为几个 3 * 2 = 6分区。

  但是,由于该 PARTITION BY RANGE 条款的作用,其中的前 2 个仅存储该 purchased 列中值小于1990的那些记录。

  可以由 RANGE 或分隔的子分区表 LIST。子分区可以使用 HASH 或 KEY 分区。这也称为 复合分区。

  也可以使用SUBPARTITION子句明确定义子部分 来指定各个子分区的选项。

  举例:

CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990) (
SUBPARTITION s0,
SUBPARTITION s1
),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s2,
SUBPARTITION s3
)
);

  // 参考自 MySQL 官网

MySQL 分区知识点(一 )的更多相关文章

  1. MySQL 分区知识点(三)

    前言: MySQL 分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表, 从 information_schema.INNODB_SYS_TABLES 系统表可以看到每个分 ...

  2. MySQL 分区知识点(二)

    前言: MySQL 5.1+ 版本就开始支持分区功能了. 分区本质上就是在物理文件层面划分了多个物理子表来支撑,或者说是一组底层表的句柄对象的封装. 对于分区表的请求,都是通过句柄对象转化成对存储引擎 ...

  3. mysql常见知识点总结

    mysql常见知识点总结 参考: http://www.cnblogs.com/hongfei/archive/2012/10/20/2732516.html https://www.cnblogs. ...

  4. 可能是全网最好的MySQL重要知识点 | 面试必备

    可能是全网最好的MySQL重要知识点 | 面试必备  mp.weixin.qq.com 点击蓝色“程序猿DD”关注我 回复“资源”获取独家整理的学习资料! 标题有点标题党的意思,但希望你在看了文章之后 ...

  5. MySQL重要知识点

    可能是全网最好的MySQL重要知识点 |  mp.weixin.qq.com 点击蓝色“程序猿DD”关注我 回复“资源”获取独家整理的学习资料! 标题有点标题党的意思,但希望你在看了文章之后不会有这个 ...

  6. Atitit 分区后的查询  mysql分区记录的流程与原理

    Atitit 分区后的查询  mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...

  7. MySQL分区总结

    MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...

  8. Mysql 分区处理NULL的得方式

    MySQL分区处理NULL值得方式 一般情况下,MySQL的分区把NULL当做零值,或者一个最小值进行处理 对于range分区 create table test_null( id int ) par ...

  9. mysql分区及实例演示

    一.为什么要分区? 需求:大数据.解决方案:分而治之,更细一点即为.将大表和大索引分为一个更小的操作单元 在mysql中,分区允许将表.索引和索引编排表细分为更小的单元.分区后,每个分区有自己单独的名 ...

随机推荐

  1. SqlProfiler的替代品-ExpressProfiler

    可以用来跟踪执行的sql语句.安装SqlServer之后SqlServerManagementStudio自带一个SqlProfiler,但是如果安装的SqlExpress,那就没有了. 项目的主页在 ...

  2. ActiveMQ 核心概念

    1.Failover 当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换. 如数据库.应用服务.硬件设备等的失效转移. 2.S ...

  3. Numpy用于数组的文件输入输出

    这一章比较简单,内容也比较少.而且对于文件的读写,还是使用pandas比较好.numpy主要是读写文本数据和二进制数据的. 将数组以二进制的格式保存到硬盘上 主要的函数有numpy.save和nump ...

  4. django事物回滚

    往数据库写入数据时,不经意间就会写入不完整的数据,我们称之为脏数据.事务管理(transaction)可以防止这种情况发生.事务管理一旦检测到写入异常,会执行回滚操作,即要么写入完整的数据,要么不写入 ...

  5. python中的关键字global和nonlocal

    知识点: global将一个变量变为全局变量 nonlocal改变最近的变量,又不是全局作用. 1.global 在python中,当引用一个变量的时候,对这个变量的搜索按找本地作用域(Local). ...

  6. PHP无限分类封装

    <?php /** +------------------------------------------------ * 通用的树型类 +--------------------------- ...

  7. mysql多表查询原理

    转:https://www.cnblogs.com/Toolo/p/3634563.html MySQL的多表查询(笛卡尔积原理)   先确定数据要用到哪些表. 将多个表先通过笛卡尔积变成一个表. 然 ...

  8. php数组函数-array_keys()

    array_keys()函数返回包含数组中所有键名的一个新数组 如果提供了第二个参数,则返回键值为该值得键名 如果strict参数指定为true,则php会使用全等(===)来严格检查键值的 数据类型 ...

  9. INSPIRED启示录 读书笔记 - 第5章 产品管理与软件开发

    保持融洽的合作关系 形成合作关系的关键是双方承认彼此平等——任何一方不从属于另一方,产品经理负责定义正确的产品,开发团队负责正确地开发产品,双方相互依赖 产品经理要求开发团队完成任务,必须先取得他们的 ...

  10. Docker 监控平台Prometheus

    Prometheus 是一个强大的监控平台,提供了监控数据搜集.存储.处理.可视化和告警一套完整的解决方案. 官方网站:https://prometheus.io