云萌主云应用官方论坛
标题:
【转载】Mysql的分区与分表(上)
[打印本页]
作者:
飘在云端
时间:
2017-2-9 14:39
标题:
【转载】Mysql的分区与分表(上)
本帖最后由 飘在云端 于 2017-2-9 14:41 编辑
为什么要进行分区和分表呢?
当一张表的数据非常多的时候,比如单个.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作为分区的最高值。
[attach]199[/attach]
LIST分区和RANGE分区非常的相似,主要区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。
二者在语法方面非常的相似。同样建议LIST分区列是非null列,否则插入null值如果枚举列表里面不存在null值会插入失败,
这点和其它的分区不一样,RANGE分区会将其作为最小分区值存储,HASH\KEY分为会将其转换成0存储,主要LIST分区只支持整形,
非整形字段需要通过函数转换成整形;5.5版本之后可以不需要函数转换使用LIST COLUMN分区支持非整形字段,在COLUMN分区中有详细的讲解。
[attach]200[/attach]
基于给定的分区个数,将数据分配到不同的分区,hash分区只能针对整数进行hash,
对于非整形的字段只能通过表达式将其转换成整数。表达式可以是
MySQL
中任意有效的函数或者表达式,
对于非整形的hash往表插入数据的过程中会多一步表达式的计算操作,所以不建议使用复杂的表达式这样会影响性能。
mysql支持两种hash分区,常规hash(hash)和线性hash(linear hash)
[attach]201[/attach]
key分区和hash分区相似,但是key分区支持除text和blob之外的所有数据类型的分区,而hash分区只支持数字分区,
key分区不允许使用用户自定义的表达式进行分区,key分区使用系统提供的hash函数进行分区。当表中存在主键或者唯一键时,
如果创建key分区时没有指定字段系统默认会首选主键列作为分区字列,如果不存在主键列会选择非空唯一键列作为分区列,
注意唯一列作为分区列唯一列不能为null。
[attach]202[/attach]
欢迎光临 云萌主云应用官方论坛 (https://yunmengzhu.com/)
Powered by Discuz! X3.5