为什么分库分表
很多时候接口性能都是数据库造成的
并发量比较大时,大量的数据库请求,会带来磁盘IO的性能瓶颈
随着数据越来越多,导致sql查询数据,即使走了索引也比较慢
分库分表应用场景
分库和分表时不同的两个概念,解决的问题也不同
并发量很大,但是数据量比较少,可以只分库,不分表
【把库放在不同的服务器上,减少单台服务器的IO操作】
并发量不大,但数据量比较大,可以只分表,不分库
【把数据分配到不同的表,减少单表的压力】
并发量很多,数据量也比较大,既要分库,也要分表
分库分表有两个方向:垂直和水平
并发分库分表顺序,先垂直分,在水平分,垂直更简单更符合实际业务
垂直分库
分库垂直分库,针对一个系统的不同业务进行拆分,比如:用户拆到user库,商品到goods库,订单order库。拆分后放在不同的服务器上,在高并发下一定程度能够给解决IO,连接数,硬件资源等瓶颈。
垂直分表
垂直分表,大表拆小表,基于表中字段拆分,将不常用的,数据较大的拆分到扩展表,一般针对几百列的大表进行拆分。
id | name | pwd | sex | addr | phone | ... |
1 | xx | |||||
1 | xx |
垂直拆分user表 user_base表 和user_info表
id | name | pwd |
1 | xx | |
1 | xx |
id | user_id | sex | ... |
1 | 1 | ||
1 | 2 |
特点:
每个库/表的结构都不一样
每个库/表的数据列至少一列一样 user_id
每个库/表的并集是全量数据
优点:
按照业务进行拆分,拆分后业务更清晰
数据维护简单,按照业务放到不同的服务器中
缺点:
单表数据量大时,写读压力大
受业务影响,热门业务压力大,冷门业务造成资源浪费
水平拆分
水平分表,针对数据巨大的单表,按照某种规则,拆分到多个表中,但是这些表还是在一个库中。
水平分库分表,按照某种规则,把拆分的表再拆到不同的库中去
水平分库分表规则
- RANGE,按照范围拆分,比如0-10000一个表,10001到20000一个表(id/10 10个表)
- HASH取模,比如通过用户ID取模,然后分配到不同的库表中 一致性hash
- 地理区域,比如按照华北,东北等区域区分
- 时间拆分,比如将6个月前的数据拆出去放到一张表,随着时间的流逝,这些表的数据查询的机率很小,这就是冷热数据分离
水平分表:
id | name | pwd | sex | addr | phone | ... |
1 | ||||||
2 |
拆分为两个表,user1, user2表 【按照10来取模id%10=x】
id | name | pwd | sex | addr | phone | ... |
1 |
id | name | pwd | sex | addr | phone | ... |
2 |
水平拆分
特点:
每个库/表的结构都一样
每个库/表的数据都不一样
每个库/表的并集时全量数据
优点:
单库表的数据减少,有利性能
库表结构相同,程序改动小
缺点:
数据扩容难度大,比如取模的值变了 【%2 变成了%10 不同的取模落到的库不一样】