前言:

  查了下资料,关于 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. Libsvm在matlab环境下使用指南

    一.安装 http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/.在这个地址上可以下的包含matlab接口的源程序.下载完后可以放到放到任意的盘上解压,最好建 ...

  2. 入坑第二式 golang入坑系列

    史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...

  3. 剑指offer 面试50题

    面试50题: 题目:第一个只出现一次的字符 题:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置. 解题思路一:利用Python特 ...

  4. 阿里云centos+java环境搭建

    目录 .准备 .安装jdk .安装tomcat .安装mysql 1.准备 购买阿里云服务器,我买的是Centos 6.5. 因为是linux,在window下管理我使用XManager,这个软件可以 ...

  5. Django 进阶篇之 CSRF,COOIKE,SESSION

    1.CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网 ...

  6. api响应类

    接口开发响应类封装 class response{ /* * 封通信接口数据 * @param integer $code 状态码 * @param string $message 状态信息 * @p ...

  7. 【LeetCode】【矩阵旋转】Rotate Image

    描述 You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise ...

  8. flex 实现图片播放 方案二 把临时3张图片预加载放入内存

    该方案,是预加载:前一张,当前,下一张图片,一共3张图片放入内存中.这样对内存的消耗可以非常小,加载之后的图片就释放内存. 下面示例一个是类ImagePlayers,一个是index.mxml pac ...

  9. bex5部署后不更新

    哪个模块没更新,就编译哪个模块 在x5/tools/compile下,运行对应模块的bat,并清空浏览器缓存 如果修改了.w文件,也可以删除相应的.catch文件夹 和.release文件夹,并且注意 ...

  10. STM32F4XX高效驱动篇2 I2C

    说到I2C很多用过STMF10X硬件I2C方式的工程师,都感觉有点头痛.大部分还是使用软件模拟的方式,I2C由于一般的工作频率是400,100KHz.所以在平凡读取,或所读数据量大时,使用这模拟的方式 ...