分库分表分区
数据库分库、分表和分区是水平切分数据库的策略,有助于提高数据库性能、可伸缩性和负载均衡。
概念
- **分库:**将一个库的数据拆分到多个相同的库中,访问的时候访问一个库。
- **分表:**把一个表的数据放到多个表中,操作对应的某个表就行。
- **分区:**是指将同一表中不同行的记录分配到不同的物理文件中。
目的就是减少数据库的负担,提高数据库的效率。
应用场景
- 多租户系统:分库可确保不同租户的数据隔离,提高安全性和性能。
- 时间序列数据:分表和分区用于处理大量时间序列数据,提高时间范围内的查询性能。
- 大规模电子商务平台:分库和分表可确保商品、订单等数据均匀分布,提高负载均衡和性能。
- 数据保留政策:分区可用于实现数据保留策略,将数据分为热数据和冷数据。
拆分方式
垂直拆分
数据库垂直拆分
垂直拆分:是指数据表列的拆分,把一张列比较多的表拆分为多张表。
例如,根据业务拆分,例如电商系统,拆分成用户表,订单表,商品表。
表垂直拆分
根据业务去拆分表,如图,把user表拆分成user_base表和user_info表,use_base负责存储登录,user_info负责存储基本用户信息
优缺点
优点:
- 拆分后业务清晰(专库专用按业务拆分)
- 数据维护简单,按业务不同,业务放到不同机器上
缺点:
- 如果单表的数据量,写读压力大。
- 受某种业务决定,或者被限制,也就是说一个业务往往会影响到数据库的瓶颈(性能问题,如双十一抢购)。
- 部分业务无法关联join,只能通过java程序接口去调用,提高了开发复杂度。
水平拆分
数据水平拆分
水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。
例如,按会员库拆分,拆分成会员1库,会员2库,以userId拆分,userId尾号0-5为1库 6-9为2库,还有其他方式,进行取模,偶数放到1库,奇数放到2库
表的水平拆分
如图把users表拆分成users1表和users2表,以userId拆分,进行取模,偶数放到users1表,奇数放到users2表
优点:
- 单库/单表的数据保持在一定量(减少),有助于性能提高
- 提高了系统的稳定性和负载能力
- 拆分表的结构相同,程序改造较少。
缺点:
- 数据的扩容很有难度维护量大
- 拆分规则很难抽象出来
- 分片事务的一致性问题部分业务无法关联join,只能通过java程序接口去调用