首页 > 学院 > 开发设计 > 正文

Mysql的分区与分表

2019-11-09 13:34:38
字体:
来源:转载
供稿:网友
为什么要进行分区和分表呢?当一张表的数据非常多的时候,比如单个.myd文件都达到10G, 这时,必然读取起来效率降低.可不可以把表的数据分开在几张表上? 可以的.什么是分表,从表面意思上看呢,就是把一张表分成N多个小表什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上1: 从业务角度可以解决.(分表)比如, 通过id%10 , user0 , user1....user9, 这10张表根据不同的余数,来插入或查询某张表.2: 通过MySQL的分区功能mysql将会根据指定的规则,把数据放在不同的表文件上.相当于在文件上,被拆成了小块.但是,给客户的界面,还是1张表.数据处理上 分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。提高性能上 分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了分区我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。 在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的实现的难易度上 分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。 分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。 mysql分表和分区有什么联系呢 (建议分区)都能提高mysql的性高,在高并发状态下都有一个良好的表面分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试)访问量不大,但是表数据很多的表,我们可以采取分区的方式等分表的实现的几种方式Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。Composite(复合模式) –以上模式的组合使用 

range分区基于一个给定的连续区间范围,早期版本range主要是基于整数的分区。在5.7版本中date datetime列也可以使用range分区,同时在5.5以上的版本提供了基于非整形的range column分区。range分区必须的连续的且不能重叠。使用"values less than ()" 来定义分区区间,非整形的范围值需要使用单引号,并且可以使用maxvalue作为分区的最高值。

LIST分区和RANGE分区非常的相似,主要区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。二者在语法方面非常的相似。同样建议LIST分区列是非null列,否则插入null值如果枚举列表里面不存在null值会插入失败,这点和其它的分区不一样,RANGE分区会将其作为最小分区值存储,HASH/KEY分为会将其转换成0存储,主要LIST分区只支持整形,非整形字段需要通过函数转换成整形;5.5版本之后可以不需要函数转换使用LIST COLUMN分区支持非整形字段,在COLUMN分区中有详细的讲解。

基于给定的分区个数,将数据分配到不同的分区,hash分区只能针对整数进行hash,对于非整形的字段只能通过表达式将其转换成整数。表达式可以是mysql中任意有效的函数或者表达式,对于非整形的hash往表插入数据的过程中会多一步表达式的计算操作,所以不建议使用复杂的表达式这样会影响性能。mysql支持两种hash分区,常规hash(hash)和线性hash(linear hash)

key分区和hash分区相似,但是key分区支持除text和blob之外的所有数据类型的分区,而hash分区只支持数字分区,key分区不允许使用用户自定义的表达式进行分区,key分区使用系统提供的hash函数进行分区。当表中存在主键或者唯一键时,如果创建key分区时没有指定字段系统默认会首选主键列作为分区字列,如果不存在主键列会选择非空唯一键列作为分区列,注意唯一列作为分区列唯一列不能为null。

column分区是5.5开始引入的分区功能,只有range column和list column这两种分区;支持整形、日期、字符串;range和list的分区方式非常的相似。columns和range和list分区的区别1.针对日期字段的分区就不需要再使用函数进行转换了,例如针对date字段进行分区不需要再使用year()表达式进行转换。2.column分区支持多个字段作为分区键但是不支持表达式作为分区键。columns支持的类型整形支持:tinyint,smallint,mediumint,int,bigint;不支持decimal和float时间类型支持:date,datetime字符类型支持:char,varchar,binary,varbinary;不支持text,blob目前mysql可用的分区类型主要有以下几种:range分区:基于一个给定的连续区间范围,range主要是基于整数的分区,对于非整形的字段需要利用表达式将其转换成整形。list分区:是基于列出的枚举值列表进行分区。columns分区:可以无需通过表达式进行转换直接对非整形字段进行分区,同时columns分区还支持多个字段组合分区,只有rangelist存在columns分区,columns是range和list分区的升级。hash分区:基于给定的分区个数,将数据分配到不同的分区,hash分区只能针对整数进行hash,对于非整形的字段只能通过表达式将其转换成整数。key分区:支持除text和blob之外的所有数据类型的分区,key分区可以直接基于字段做分区无需转换成整数。新增分区:注意:增加分区只能在最大端增加alter table lange add partition (partition p3 values less than (30000));删除分区:注意:通过这种删除分区的方式会将分区中的数据也删除,慎用!!!!但是通过删除分区的方式删除数据会比delete快很多,因为它相当于删除一个数据库一样因为每个分区都是一个独立的数据文件。用来删除历史分区数据是非常好的办法。alter table lange drop partition p3;合并分区:拆分合并分区统称为重新定义分区,拆分分为不会造成数据的丢失,只将会将数据从一个分区移动到另一个分区。alter table langereorganize partition p1,p2,p3 into(partition p4 values less than (40000),partition p5 values less than (50000),partition p6 values less than (60000));移除分区:alter table tablenameremove partitioning ;注意:使用remove移除分区是仅仅移除分区的定义,并不会删除数据和drop PARTITION不一样,后者会连同数据一起删除


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表