为什么要分库分表?

一般的机器,(4核16G),单库的MySQL并发(QPS+TPS)超过了2K,系统基本就完蛋了。。。最好是并发量控制在1k左右。这里就引出一个问题,为什么要分库分表?

分库分表目的:解决高并发,和数据量大的问题。
  1. 高并发情况下,会造成IO读写频繁,自然会造长城读写缓慢甚至宕机。一般单库不能超过2k并发。
  2. 数据量大的问题主要由于底层索引实现导致,MySQL的索引实现为B+TREE,数据量巨大,会导致索引树十分庞大,造成查询缓慢。第二,innodb的最大存储限制为64TB。

要解决上述的问题,最常见做法就是分库分表。分库分表的目的,是将一个表拆成N个表,就是让每个表的数据量控制在一定范围内保证sql性能。一个表数据建议不要超过500W。

分库分表的两种划分

又分为垂直拆)和水平拆分

  • 水平拆分:将一个表的数据拆到不同的库不同的表中。可以根据时间、地区、或某个业务键维度,也可以通过hash进行拆分,最后通过路由访问到具体的数据。拆分后的每个表结构保持一致。
  • 垂直拆分:一个有很多字段的表拆分成多个表,或者是多个库上去。每个库表的结构都不一样,每个库表都包含部分字段。一般来说,可以根据业务维度进行拆分,如订单表可以拆分为订单、订单支持、订单地址、订单商品、订单扩展等表;也可以,根据数据冷热成都划分,20%的热点字段拆到一个表,80%的冷字段拆到另外一个表。
    图片说明

小结:

垂直拆分:业务模块拆分、商品库,用户库,订单库

水平拆分:对表进行水平拆分(也就是我们说的:分表)

表进行垂直拆分:表的字段过多,字段使用的频率不一。(也可以拆分成两个表建立 1:1 关系 )