前言
本篇文章只介绍数据库水平分库分表的概念,不涉及到任何分库分表操作。作为下一篇数据库分库分表解决方案的基础
【面试】在面试时,经常会被问到这样的一个问题
- 你知道什么是分表分库?
- 你公司有没有分表分库的案例?详细说说
针对第一个问题,主要是讲一下分表分库的概念,这里要区分四种(分表、分库) * (水平、垂直)= 4种
针对第二个问题,详细看看第二篇文章咯
业务场景
数据库数据量是不可控的,随着时间和业务发展,导致表里面数据越来越多,如果再去对数据库表做CURD操作时,会造成性能问题
解决方案
- 从硬件上,提高硬件设备,如CPU,或者内存。成本高,最早淘宝就是升级硬件设备,已经达到顶级配置了仍然达不需求。
- 分库分表:将数据库进行拆分、数据表进行拆分。
分库分表
分库分表有两种方式:垂直切分和水平切分
- 垂直分表:将一张表的字段划分为多张表,每张表只存储一部分数据数据。
举个例子:
在这个课程列表及详情中,可以设置成一张表,课程信息表:课程名称、课程封面、课程价格、课程描述、其他信息
也可以设计成:课程基本信息、课程描述信息
又如:
mer_info(用户信息表) mer_passwd(用户交易密码) mer_sectret(用户密钥信息表)
三者都是1对1对1的关系,因此设计成一张表也是可以的,但是在实际开发中,把能独立、少操作的、不需要一起展示的单独成一张表,这就是垂直分表
2. 垂直分库:把单一数据库按照业务划分,专库专表
在分布式项目中,经常可以看到,根据业务拆分项目,每个项目单独连不同的数据库
如: user用户服务、account账户服务、trade交易服务、rate汇率服务,每个服务单独连自己的数据库
3. 水平分库:在两个不同的数据库上都有相同的一张表,根据某种路由规则对这张表进行操作
4. 水平分表:在同一个数据库上有两张相同结构的表,表名不同,根据某种路由规则对这张表进行操作。
原则
- 在数据库设计的时候考虑垂直分库和垂直分表
- 随着数据库数据量增加,不要马上考虑做水平切分,首先考虑缓存处理,读写分离,使用索引等等方式,如果这些方式不能根本解决问题,再考虑做水平分库和水平分表。
分库分表导致问题
1、跨节点谅解查询问题(分页、排序)
2、多数据源管理问题