数据库的分库分表

当MySQL单表记录数过大时,增删改查性能都会急剧下降。

通常在以整型值为主的表数据量达到千万级时,以字符串为主的表达到五百万的时候就需要考虑分库分表。

一般来说,数据库的分库分表分为两种拆分形式,即纵向和横向。

 

垂直拆分:垂直分库:解决表过多的问题; 垂直分表:解决单表列过多的问题。通常根据业务耦合性,将关联性低的表划分到不同的数据库。

垂直拆分的优点:

  • 可以使得行数据变小,一个数据块(Block)就能存放更多的数据,在查询时就会减少I/O次数(每次查询时读取的Block 就少)

  • 可以达到最大化利用Cache的目的,具体在垂直拆分的时候可以将不常变的字段放一起,将经常改变的放一起

  • 数据维护简单

垂直拆分的缺点:

  • 主键出现冗余,需要管理冗余列

  • 会引起表连接JOIN操作(增加CPU开销)可以通过在业务服务器上进行join来减少数据库压力

  • 依然存在单表数据量过大的问题(需要水平拆分)

  • 事务处理复杂

 

水平拆分:水平分库分表:解决单表数据量过大的问题。按照表内某个字段,根据规则将同一个表拆分到多个数据库或多个表中。

水平拆分的优点 :

  • 不存在单库大数据和高并发的性能瓶颈

  • 应用端改造较少

  • 提高了系统的稳定性和负载能力

水平拆分的缺点:

  • 分片事务一致性难以解决

  • 跨节点Join性能差,逻辑复杂

  • 数据多次扩展难度跟维护量极大

 

 拆分以后生成分布式id的方法:

  • 使用Twitter的SnowFlake的算法来生成
  • 单独唯护一张表
  • zookeeper,mongoDb中的方法

 

未完待续...

posted @ 2019-05-06 22:17  有梦想的人不睡觉s  阅读(548)  评论(0编辑  收藏  举报