分库分表
从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。原则上,在业务足够复杂、数据量足够大的情况下,需要进行分库分表。
举个栗子:
一个库里有两张表,一张表读写频繁,另一张表读写不频繁,这时候分开存储到不同的库性能比较好。
user表如果有千万级的数据,如果我们根据userId以一定的区间划分,然后每个区间内的user落到对应区间序号的表中,这样单表数据量就降低了。
实现方式
- 垂直划分
- 将表按照功能模块、关系密切程度划分出来,部署到不同的分库上。例如,把日志相关的存储在一个DB1中,把用户的数据存储到DB2等。
- 水平划分
- 当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上。
优点
- 不同库分开管理,便于维护
- 服务器的资源是有限的,在应用不断迭代过程中,数据量会越来越大,相应地对数据库的CURD操作的开销也越来越大,分表有利于数据存储。
存在问题
- 事务管理比较困难,是因为数据存储到不同分库中,如果通过程序来处理事务,在写逻辑部分就比较复杂。
- 跨库跨表通过join查询比较复杂,原本可以一次性查询的操作,需要拆分多次查询。