当MySQL单表记录数过大时,增删改查性能都会急剧下降。
通常在以整型值为主的表数据量达到千万级时,以字符串为主的表达到五百万的时候就需要考虑分库分表。
一般来说,数据库的分库分表分为两种拆分形式,即纵向和横向。
垂直拆分:垂直分库:解决表过多的问题; 垂直分表:解决单表列过多的问题。通常根据业务耦合性,将关联性低的表划分到不同的数据库。
垂直拆分的优点:
-
可以使得行数据变小,一个数据块(Block)就能存放更多的数据,在查询时就会减少I/O次数(每次查询时读取的Block 就少)
-
可以达到最大化利用Cache的目的,具体在垂直拆分的时候可以将不常变的字段放一起,将经常改变的放一起
-
数据维护简单
垂直拆分的缺点:
-
主键出现冗余,需要管理冗余列
-
会引起表连接JOIN操作(增加CPU开销)可以通过在业务服务器上进行join来减少数据库压力
-
依然存在单表数据量过大的问题(需要水平拆分)
-
事务处理复杂
水平拆分:水平分库分表:解决单表数据量过大的问题。按照表内某个字段,根据规则将同一个表拆分到多个数据库或多个表中。
水平拆分的优点 :
-
不存在单库大数据和高并发的性能瓶颈
-
应用端改造较少
-
提高了系统的稳定性和负载能力
水平拆分的缺点:
-
分片事务一致性难以解决
-
跨节点Join性能差,逻辑复杂
-
数据多次扩展难度跟维护量极大
拆分以后生成分布式id的方法:
- 使用Twitter的SnowFlake的算法来生成
- 单独唯护一张表
- zookeeper,mongoDb中的方法
未完待续...