搜索

搜索

【转载】Mysql的分区与分表(上)

[复制链接]
飘在云端 发表于 2017-2-9 14:39:03 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 飘在云端 于 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作为分区的最高值。 1.png

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

2.png
基于给定的分区个数,将数据分配到不同的分区,hash分区只能针对整数进行hash,
对于非整形的字段只能通过表达式将其转换成整数。表达式可以是MySQL中任意有效的函数或者表达式,
对于非整形的hash往表插入数据的过程中会多一步表达式的计算操作,所以不建议使用复杂的表达式这样会影响性能。
mysql支持两种hash分区,常规hash(hash)和线性hash(linear hash)
3.png
key分区和hash分区相似,但是key分区支持除text和blob之外的所有数据类型的分区,而hash分区只支持数字分区,
key分区不允许使用用户自定义的表达式进行分区,key分区使用系统提供的hash函数进行分区。当表中存在主键或者唯一键时,
如果创建key分区时没有指定字段系统默认会首选主键列作为分区字列,如果不存在主键列会选择非空唯一键列作为分区列,
注意唯一列作为分区列唯一列不能为null。
4.png
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门图文
热门帖子
排行榜
作者专栏

云萌主

优质视频教程

实战教程总结

行业最全文库

  • 官网微信

    每天官微五分钟一年萌新变大神

    扫码关注
  • 新浪微博

    每天50篇设计干货30万设计师关注!

    访问新浪微博
  • 官方客服
云萌主Cloud

云萌主等你来关注

Copyright   ©2015-2016  云萌主论坛Powered by©Discuz!技术支持:云萌主     ( 京ICP备18052714号 )