MySql分区、分表和分库( 四 )


分表只能通过程序代码来实现 , 目前市面上有许多分表的框架 。( Apache ShardingSphere )
分表和分区的区别

  1. 分区只是一张表中的数据和索引的存储位置发生改变 , 分表则是将一张表分成多张表 , 是真实的有多套表的配套文件
  2. 分区没法突破数据库层面 , 不论怎么分区 , 这些分区都要在一个数据库下 。而分表可以将子表分配在同一个库中 , 也可以分配在不同库中 , 突破数据库性能的限制 。
  3. 分区只能替代水平分表的功能 , 无法取代垂直分表的功能 。
分表的类型分表分为水平分表和垂直分表 。
水平分表水平分表和分区很像 , 或者说分区就是水平分表的数据库实现版本 , 它们分的都是行记录 。
MySql分区、分表和分库

文章插图
 
但是需要注意 , 如果这些表还是在同一个库中 , 所以库级别的数据库操作还是有IO瓶颈 。分表可以将单张表的数据切分到多个服务器上去 , 每个服务器具有相应的库与子表 , 这是分区所不能有的优势 。
水平分表的切分规则一般有如下几种:
范围切分
  • 可以根据某个字段的范围做划分 , 比如订单号字段 , 从0到10000一个表 , 10001到20000一个表 。
HASH取模
  • 可以根据某个字段的HASH取模做划分 , 比如将一个用户表分成10个子表 , 可以取用户id , 然后hash后取10的模 , 从而分配到不同的数据库上 。不过这种划分一旦确定后 , 就无法改变子表数量了 。
地理/国籍/类型等
  • 比如按照华东 , 华南 , 华北这样来区分业务表 , 或者Android/ target=_blank class=infotextkey>安卓用户 , IOS用户等来区分用户表 。
时间
  • 按照时间切分 , 比如将6个月前 , 甚至一年前的数据切出去放到另外的一张表 , 因为随着时间流逝 , 这些表的数据被查询的概率变小 , 所以没必要和“热数据”放在一起 , 这个也是“冷热数据分离” 。
垂直分表水平分表分的是行记录 , 而垂直分表 , 分的是列字段 , 它就像用一把刀 , 垂直的将一个表切成多张表一样 。
垂直分表是基于列字段进行的 。一般是表中的字段较多 , 或者有数据较大长度较长(比如text , blob , varchar(1000)以上的字段)的字段时 , 我们将不常用的 , 或者数据量大的字段拆分到“扩展表”上 。这样避免查询时 , 数据量太大造成的“跨页”问题 。
垂直分表的切分规则很好理解 , 一般是“不常用”或者“字段数据量大”这两点来做切割
MySql分区、分表和分库

文章插图
 
分库分库同样是为了应对超大数据带来的巨大的IO需求 , 如果不拆库 , 那么单库所能支持的吞吐能力和磁盘空间 , 就会成为制衡业务发展的瓶颈 。
分库的主要目的是为突破单节点数据库服务器的I/O能力限制 , 解决数据库水平扩展性问题 。
分库作用分区和分表可以把单表分到不同的硬盘上 , 但不能分配到不同服务器上 。一台机器的性能是有限制的 , 用分库可以解决单台服务器性能不够 , 或者成本过高问题 。
将一个库分成多个库 , 并在多个服务器上部署 , 就可以突破单服务器的性能瓶颈 , 这是分库必要性的最主要原因 。
分库的类型【MySql分区、分表和分库】分库同样分为水平分库和垂直分库 。
水平分库