MySQL支持RANGE,LIST,HASH和KEY四种分区。其中,每个分区又都有一种特殊的类型。对于RANGE分区,有RANGE COLUMNS分区。对于LIST分区,有LIST COLUMNS分区。对于HASH分区,有LINEAR HASH分区。对于KEY分区,有LINEAR KEY分区。具体如下:

RANGE分区

RANGE即范围分区,根据区间来判断位于哪个分区,譬如,在下例中,如果store_id小于6,则新增或修改的记录会被分配到p0分区,如果大于6小于11,则记录会被分配到p1分区,依次类推。类似于编程语言中的if ... elseif ...语句。

格式如下:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT NOT NULL,
  8. store_id INT NOT NULL
  9. )
  10. PARTITION BY RANGE (store_id) (
  11. PARTITION p0 VALUES LESS THAN (6),
  12. PARTITION p1 VALUES LESS THAN (11),
  13. PARTITION p2 VALUES LESS THAN (16),
  14. PARTITION p3 VALUES LESS THAN MAXVALUE
  15. );

注意:

1. RANGE分区的返回值必须为整数。

2. PARTITION p3 VALUES LESS THAN MAXVALUE 是非必需的。

RANGE COLUMNS分区

RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE分区的区别如下:

1. RANGE COLUMNS不接受表达式,只能是列名。而RANGE分区则要求分区的对象是整数。

2. RANGE COLUMNS允许多个列,在底层实现上,它比较的是元祖(多个列值组成的列表),而RANGE比较的是标量,即数值的大小。

3. RANGE COLUMNS不限于整数对象,date,datetime,string都可作为分区列。

格式如下:

  1. CREATE TABLE rcx (
  2. a INT,
  3. b INT,
  4. c CHAR(3),
  5. d INT
  6. )
  7. PARTITION BY RANGE COLUMNS(a,d,c) (
  8. PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
  9. PARTITION p1 VALUES LESS THAN (10,20,'mmmm'),
  10. PARTITION p2 VALUES LESS THAN (15,30,'sss'),
  11. PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
  12. );

同RANGE分区类似,它的区间范围必须是递增的,有时候,列涉及的太多,不好判断区间的大小,可采用下面的方式进行判断:

  1. mysql> SELECT (5,10) < (5,12), (5,11) < (5,12), (5,12) < (5,12);
  2. +-----------------+-----------------+-----------------+
  3. | (5,10) < (5,12) | (5,11) < (5,12) | (5,12) < (5,12) |
  4. +-----------------+-----------------+-----------------+
  5. | 1 | 1 | 0 |
  6. +-----------------+-----------------+-----------------+
  7. 1 row in set (0.07 sec)

关于RANGE COLUMNS的更多说明,可参考MySQL官方文档:

http://dev.mysql.com/doc/refman/5.6/en/partitioning-columns-range.html

LIST分区

LIST即列表分区。

格式如下:

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

LIST COLUMNS分区

LIST COLUMNS分区同样是LIST分区的一种特殊类型,它和RANGE COLUMNS分区较为相似,同样不接受表达式,同样支持多个列支持string,date和datetime类型。

格式如下:

  1. CREATE TABLE customers_1 (
  2. first_name VARCHAR(25),
  3. last_name VARCHAR(25),
  4. street_1 VARCHAR(30),
  5. street_2 VARCHAR(30),
  6. city VARCHAR(15),
  7. renewal DATE
  8. )
  9. PARTITION BY LIST COLUMNS(renewal) (
  10. PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
  11. '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
  12. PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
  13. '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
  14. PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
  15. '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
  16. PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
  17. '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
  18. );

多列格式如下:

  1. CREATE TABLE customers_2 (
  2. first_name VARCHAR(25),
  3. last_name VARCHAR(25),
  4. street_1 VARCHAR(30),
  5. street_2 VARCHAR(30),
  6. city VARCHAR(15),
  7. renewal DATE
  8. )
  9. PARTITION BY LIST COLUMNS(city,last_name,first_name) (
  10. PARTITION pRegion_1 VALUES IN (('Oskarshamn', 'Högsby', 'Mönsterås'),('Nässjö', 'Eksjö', 'Vetlanda')),
  11. PARTITION pRegion_2 VALUES IN(('Vimmerby', 'Hultsfred', 'Västervik'),('Uppvidinge', 'Alvesta', 'Växjo'))
  12. );

HASH分区

和RANGE,LIST分区不同的是,HASH分区无需定义分区的条件。只需要指明分区数即可。

格式如下:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. )
  10. PARTITION BY HASH(store_id)
  11. PARTITIONS 4;

注意:

1. HASH分区可以不用指定PARTITIONS子句,如上文中的PARTITIONS 4,则默认分区数为4。

2. 不允许只写PARTITIONS,而不指定分区数。

3. 同RANGE分区和LIST分区一样,PARTITION BY HASH (expr)子句中的expr返回的必须是整数值。

4. HASH分区的底层实现其实是基于MOD函数。譬如,对于下表

  1. CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
  2. PARTITION BY HASH( YEAR(col3) )
  3. PARTITIONS 4;

如果你要插入一个col3为“2005-09-15”的记录,则分区的选择是根据以下值决定的:

  1. MOD(YEAR('2005-09-01'),4)
  2. = MOD(2005,4)
  3. = 1

LINEAR HASH分区

LINEAR HASH分区是HASH分区的一种特殊类型,与HASH分区是基于MOD函数不同的是,它基于的是另外一种算法。

格式如下:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. )
  10. PARTITION BY LINEAR HASH( YEAR(hired) )
  11. PARTITIONS 4;

说明:

1. 它的优点是在数据量大的场景,譬如TB级,增加、删除、合并和拆分分区会更快,缺点是,相对于HASH分区,它数据分布不均匀的概率更大。

2. 具体算法,可参考MySQL的官方文档

http://dev.mysql.com/doc/refman/5.6/en/partitioning-linear-hash.html

KEY分区

KEY分区其实跟HASH分区差不多,不同点如下:

1. KEY分区允许多列,而HASH分区只允许一列。

2. 如果在有主键或者唯一键的情况下,key中分区列可不指定,默认为主键或者唯一键,如果没有,则必须显性指定列。

3. KEY分区对象必须为列,而不能是基于列的表达式。

4. KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。

格式如下:

  1. CREATE TABLE k1 (
  2. id INT NOT NULL PRIMARY KEY,
  3. name VARCHAR(20)
  4. )
  5. PARTITION BY KEY()
  6. PARTITIONS 2;

在没有主键或者唯一键的情况下,格式如下:

  1. CREATE TABLE tm1 (
  2. s1 CHAR(32)
  3. )
  4. PARTITION BY KEY(s1)
  5. PARTITIONS 10;

LINEAR KEY分区

同LINEAR HASH分区类似。

格式如下:

  1. CREATE TABLE tk (
  2. col1 INT NOT NULL,
  3. col2 CHAR(5),
  4. col3 DATE
  5. )
  6. PARTITION BY LINEAR KEY (col1)
  7. PARTITIONS 3;

总结:

1. MySQL分区中如果存在主键或唯一键,则分区列必须包含在其中。

2. 对于原生的RANGE分区,LIST分区,HASH分区,分区对象返回的只能是整数值。

3. RANGE COLUMNS,LIST COLUMNS,KEY,LINEAR KEY分区对象只能是列,不能是基于列的表达式。

MySQL分区总结的更多相关文章

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

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

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

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

  3. mysql分区及实例演示

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

  4. mysql分区

    <?php /* 分区 目录 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. ...

  5. Mysql分区技术

    注:分区的语法可以看手册中有详细的写法和例子: show plugins; 此命令查看可有partition这个选项,有则mysql支持分区,没有的话,就可以升级一下mysql 实时监控一个命令执行情 ...

  6. 十五、mysql 分区之 分区管理

    1.mysql分区处理分区字段NULL值的方式 1.range分区null被当作最小值处理 2.list分区null值必须被枚举出来,否则将出错 3.hash/key分区 null值当作0处理 2.R ...

  7. MySQL分区技术 (一)

    4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...

  8. Mysql 分区详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt120 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.m ...

  9. MySQL 分区建索引

    200 ? "200px" : this.width)!important;} --> 介绍 mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张 ...

随机推荐

  1. 设置label上文字大小、颜色不一样 NSMutableAttributedString的使用

  2. java爬虫:在请求body中增加json数据采集

    1,http://www.hqepay.com/public/expressquery.html 查询快递不是将键值对post过去,而是将json数据放到body中发送过去.抓包如下: 2,需要导入一 ...

  3. Spark 应用程序调优

    对于很多刚接触Spark的人来说,可能主要关心数据处理的逻辑,而对于如何高效运行Spark应用程序了解较少.由于Spark是一种分布式内存计算框架,其性能往往受限于CPU.内存.网络等多方面的因素,对 ...

  4. Centos 6.5 部署 redmine 3.3

    验证ruby版本 如果有就卸载安装最新的 yum install gcc* openssl openssl-devel -y wget https://ruby.taobao.org/mirrors/ ...

  5. 用Unity实现时间倒退效果

    记得以前看过一个电影,叫做<独立游戏大电影>,其中有个一个游戏可以实现时间回退的功能,可以像倒带一样,十分有趣.因此我就想着用Unity也实现一个类似的简单Demo,说不定哪天会用到. 效 ...

  6. Fedora17安装MySQL及配置

    一.安装 以下操作均是在root用户下进行操作.首先,如果以前有安装过,这次卸载后安装的话,最好是先将/var/lib/mysql/里面的内容全部删掉(如果不重要的话),我就遇到过没有删除这些东西,结 ...

  7. ASP.NET MVC 多语言方案

    前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密 ...

  8. 解读ASP.NET 5 & MVC6系列(7):依赖注入

    在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET 5正式将依赖注入进行了全功能的实现,以便开发人员能够开发更具弹性的组件程 ...

  9. Lesson 11 One good turn deserves another

    Text I was having dinner at a restaurant when Tony Steele came in. Tony worked in a layer's office y ...

  10. 剑指Offer面试题:21.从上到下打印二叉树

    一.题目:从上到下打印二叉树 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图中的二叉树,则依次打印出8.6.10.5.7.9.11. 二叉树节点的定义如下,采用 ...