博文大纲:

1、RANGE分区

2、LIST分区

3、HASH分区

4、key分区

5、MySQL分表和分区的区别

6、附加:如何实现将分区放在不同的目录下进行存储

MySQL分区类型如下:

RANFGE分区

LIST分区

HASH分区

key分区

上面的四种分区的条件必须是整形,如果不是整形需要通过函数将其转换为整形。

1、RANGE分区

RANGE分区是基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用values less than操作符来进行定义。

创建一个RANGE分区方式的表:

mysql> 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 (21)

-> );

按照这种分区方案,当插入的记录store_id小于6,会保存在p0这个分区,如果store_id小于11则会将数据保存在p1这个分区.....以此类推。但是在上面的分区方案中,定义的最后一个分区是小于21的,那么,如果此时有store_id大于或等于21的记录,则会插入失败,因为数据库不知道应该插入到哪个分区中,避免这种情况的发生,就需要在指定分区方案或者新增一个分区,最后一个分区指定的范围应该为maxvalue,而不是一个具体的值。

根据上面创建的表,可以添加一个范围为maxvalue的分区,命令如下:

mysql> alter table employees add partition (partition p4 values less than maxvalue);

如果最后一个分区指定的范围是maxvalue,那么后期想要添加分区的话,需要使用以下方式(使用类似于分区合并的指令):

mysql> alter table employees reorganize partition p4 into

-> ( partition p03 values less than (25),

-> partition p04 values less than maxvalue

-> );

删除分区的指令如下(注:当分区被删除,那么分区所存储的数据也将被删除,慎用!!!):

mysql> alter table employees drop partition p2;

2、LIST分区

LIST分区类似于RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。LIST分区通过使用“partition by list(expr)”来实现,其中“expr”是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“values in(value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。

创建LIST分区类型举例:

mysql> 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 '2100-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)

-> );

在上面创建的表中,如果插入一个store_id为22(不在定义的分列表中)的数据,那么将会插入失败,如下:

失败的原因就是:LIST分区没有类似如“VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义。将要匹配的任何值都

必须在值列表中找到。

解决办法就是增加有这个值的分区,如下:

mysql> alter table employees add partition (partition p4 values ins (22,23,24));

3、HASH分区

这种模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。 hash分区的目的是将数据均匀的分布到预先定义的各个分区中,保证各分区的数据量大致一致。在range和list分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中;而在hash分区中,MySQL自动完成这些工作,用户所要定一个列值或者表达式,以及指定被分区的表将要被分割成的分区数量。

1)创建hash分区的表

mysql> create table t_hash(a int(11),b datetime) partition by hash(year(b)) partitions 4;

上述创建表的命令中,使用了year函数来提取b列中的年份来做分区的依据,通过partitions来指定需要4个分区。

2)插入测试数据

mysql> insert into t_hash values(1,'2010-04-01');

上述指令插入的数据将被存放在p2分区,计算方法如下:

查看information_schema库中的partitions也可以查看到p2分区中会有1条记录,如下:

mysql> select * from information_schema.partitions where table_schema='test001' and table_name='t_hash'\G

返回结果如下:

上面的例子并不能把数据均匀的分布到各个分区,因为按照YEAR函数进行的,该值本身是离散的。如果对连续的值进行HASH分区,如自增长的主键,则可以较好地将数据平均分布。

4、key分区

key分区和hash分区相似,不同在于hash分区是用户自定义函数进行分区,key分区使用mysql数据库提供的函数进行分区,NDB cluster使用MD5函数来分区,对于其他存储引擎mysql使用内部的hash函数。

创建一个key分区的表:

mysql> create table t_key(a int(11), b datetime) partition by key(b) partitions 4;

如果后期需要新增分区,使用以下指令即可:

mysql> alter table t_key add partition partitions 5;

上述指令是新增了5个分区,也就是说,现在t_key这个表一共有9个分区了。

注: mysql-5.5开始支持COLUMNS分区,可视为RANGE和LIST分区的进化,COLUMNS分区可以直接使用非整形数据进行分区。COLUMNS分区支持以下数据类型: 所有整形,如INT SMALLINT

TINYINT BIGINT。FLOAT和DECIMAL则不支持。 日期类型,如DATE和DATETIME。其余日期类型不支持。字符串类型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT类型不支持。 COLUMNS可以使用多个列进行分区。

5、MySQL分表和分区的区别

1) 实现方式上

mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

分区不一样,一张大表进行分区后,它还是一张表,不会变成二张表,但是它存放数据的区块变多了

2)数据处理上

分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。

分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表,数据处理还是由自己来完成。

3)提高性能上

分表后,单表的并发能力提高了,磁盘I/O性能也提高了。因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。

mysql提出了分区的概念,主要是想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。

在这一点上,分区和分表的侧重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

4)实现的难易度上

分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式跟分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。

分区实现是比较简单的,建立分区表,和建平常的表没什么区别,并且对开代码端来说是透明的。

5) 其他区别

都能提高mysql的性高,在高并发状态下都有一个良好的表现。

分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式,访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。

表分区相对于分表,操作方便,不需要创建子表。

6、附加:如何实现将分区放在不同的目录下进行存储

先在本地创建好需要的目录:

[root@mysql ~]# mkdir /data

[root@mysql ~]# chown -R mysql.mysql /data

然后创建表时,指定data directory就可以,如下:

mysql> create table user(

-> id int not null auto_increment,

-> name varchar(30) not null default '',

-> primary key(id)) default charset=utf8 auto_increment=1

-> partition by range(id)(

-> partition p1 values less than (3) data directory '/data/area1',

-> partition p2 values less than (6) data directory '/data/area2',

-> partition p3 values less than (9) data directory '/data/area3');

查看本地目录,则会发现自动创建了相应的存放数据的目录,如下:

注:使用mysql默认的存储引擎inodb时候,只需要指定data directory 就可以,因为inodb的数据和索引在一个文件中。但是创建表格时指定engine=myisam时,修改分区的存储位置,需要同时指定data directory和index directory。

———————— 本文至此结束,感谢阅读 ————————

mysql 字符串类型 分区_MySQL分区类型相关推荐

  1. mysql如何进行分区_mysql如何进行分区_mysql分区有哪些方法

    MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,MySQL 在 PHP 的 web 开发中是应用最广泛.大家知道mysql如何分区的吗?下面由学习 ...

  2. mysql完整字段包括_MySQL字段类型最全解析

    前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...

  3. mysql有numeric类型吗_mysql数值类型 - numeric

    本文介绍php出现Warning: A non-numeric value encountered问题,用实例分析出现这种错误的原因,并提供避免及解决问题的方法. <?phperror_repo ...

  4. mysql是否truncate分区_MySQL分区管理

    以下是我看MySQL官方文档的时候整理的笔记,仅作参考保留. RANGE,LIST分区管理 1:为未分区表创建分区 ALTER TABLE trb3 PARTITION BY KEY(id) PART ...

  5. mysql 字符串 截取字母_MySQL字符串函数:字符串截取

    MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...

  6. mySQL字符串字段区别_MySQL类型之(字符串列类型区分、数据类型区分)

    1.首先CHAR, VARCHAR, TEXT和BINARY, VARBINARY, BLOB的区别: CHAR, VARCHAR, TEXT称为:      非二进制字符串; BINARY, VAR ...

  7. MySQL按字符串hash分区_Mysql分区

    Myisam:多个小表一个聚合表,逻辑上的 Innodb:物理文件的划分 注意事项 Show plugins Show engines Show variables like '%partition% ...

  8. mysql 数据库 数组类型转换_mysql数字类型的数据如何进行转换?

    如何将MySQL数据库中的数字类型转换为数字函数,今天给大家介绍mysql中的转换函数,这个在实际的生活应用中是运用广泛的,大大减少了我们自己手动进行数字类型的转换. 我们今天主要向大家介绍的是用My ...

  9. mysql 字段类型设计_Mysql字段类型设计相关问题!-阿里云开发者社区

    Mysql是以文件存储在我们的系统的硬盘上面,那么 (1)当我们读取写入的时候就会有磁盘IO的问题 (2)当我们存储的数据是以页单位存储,而且每页的大小是16K,那么我们要尽可能的让我们的一页数据存放 ...

最新文章

  1. Xilinx® 7 series FPGAs CLBs专题介绍(一)
  2. 邮件服务之Sendmail
  3. different color in Chrome Development Tool
  4. 【NOI2012】骑行川藏【拉格朗日乘数法】【二分套二分】
  5. 安防监控系统CIF、D1等格式的解释
  6. python去除图像光照不均匀_低光照环境下图像增强相关
  7. Vector3.MoveTowards与Vector3.Lerp()区别
  8. 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home...
  9. 八段锦是一种不错的养生运动
  10. JS无限弹窗代码实现
  11. 读后感--《魔鬼数学:大数据时代,数学思维的力量》
  12. 搭建Visual Studio C语言开发环境
  13. 高中计算机学考操作excel,高中信息技术学业水平考试Word、Excel操作题考点总结...
  14. 实测榛子云短信平台短信接收速度
  15. mysql 主从服务-主从复制数据一致性校验出现的问题
  16. 各种电机原理动态图(直流电机是切割磁力线产生感应电动势,交流电机是改变线圈中的磁场强度产生感应电动势,旋转磁场)
  17. 电商详情页缓存架构(一)电商网站的商品详情页架构
  18. 《你要如何衡量你的人生》笔记与感想(二)时光在流逝,而你失去了什么
  19. 亏麻了,华为离职后年终奖照旧发。。
  20. JuJu alpha

热门文章

  1. 使用datax同步cassandra数据
  2. 蚂蚁金服OceanBase挑战TPCC|TPC-C基准测试之数据库事务引擎挑战
  3. Node.js 应用故障排查手册 —— 雪崩型内存泄漏问题
  4. 当Kubernetes应用遇到阿里分批发布模式
  5. 关于CNN图像分类的一份综合设计指南
  6. 探索PCIe 3.0峰值性能,长江存储推新消费级固态硬盘致态TiPlus5000
  7. 低代码发展专访系列之一:低代码平台产品的使用者都是谁?
  8. 数据备份资深老牌厂商 Commvault 的新玩法
  9. 没错!现在搞 Python 越来越难了!!
  10. AWS专家论道之迁移上云的四个大趋势和七个小趋势