0
点赞
收藏
分享

微信扫一扫

MySQL数据库分表和分区的区别


分表

分表顾名思义,就是把一张超大的数据表,拆分为多个较小的表,得到有效的缓解。

超大表会带来如下的影响:

  1. 单表数据量太大,会被频繁读写,加锁操作密集,导致性能降低。
  2. 单表数据量太大,对应的索引也会很大,查询效率降低,增删操作的性能也会降低。

分表和分区看起来十分类似,确实,分区已经能够在磁盘层面将一张表拆分成多个文件了,理论上前面提到的大表的问题都能得到有效解决。因为分区就是分表的数据库实现版本。

在MySQL 5.1分区功能出现以前,要想解决超大表问题,只能采用分表操作,因为这类问题十分常见,MySQL才自带了一个分区功能,以达到相同的效果。

所以你可以直接说分区就是分表的替代,分表是分区出现以前的做法。不过这不代表我们就没有必要学习分表了,相反,水平分表的功能或许可以用更加便捷的分区来替代,但是垂直分表的功能,分区却无法替代。

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

分表和分区的区别

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

分表的类型

分表分为水平分表和垂直分表。

水平分表

水平分表和分区很像,或者说分区就是水平分表的数据库实现版本,它们分的都是行记录。

但是需要注意,如果这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。分表可以将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与子表,这是分区所不能有的优势。

水平分表的切分规则一般有如下几种:

范围切分

  • 可以根据某个字段的范围做划分,比如订单号字段,从0到10000一个表,10001到20000一个表。

HASH取模

  • 可以根据某个字段的HASH取模做划分,比如将一个用户表分成10个子表,可以取用户id,然后hash后取10的模,从而分配到不同的数据库上。不过这种划分一旦确定后,就无法改变子表数量了。

地理/国籍/类型等

  • 比如按照华东,华南,华北这样来区分业务表,或者安卓用户,IOS用户等来区分用户表。

时间

  • 按照时间切分,比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,所以没必要和“热数据”放在一起,这个也是“冷热数据分离”。


举报

相关推荐

0 条评论