一、分库分表种类
1、垂直拆分
在考虑数据拆分的时候,一般情况下,应该先考虑垂直拆分。垂直可以理解为分出来的库表结构是互相独立各不相同的、
- 如果有多个业务,每个业务直接关联性不大,那么就可以把每个业务拆分为独立的实例、库或表。
- 如果在一个库里面有多张表,那么可以把每张表拆分到不同的实例上。
- 如果你有一张表,但这个表里的字段很多,每个字段都有不同的含义,例如user表里面有姓名、生日、地址等,那么可以把每个字段独立出来拆分为一张新表。
2、水平拆分
水平拆分是针对一张表来说的。在经过垂直拆分之后,如果数据量依然很大,那么可以通过某种算法进行水平拆分。拆分后具有多张相同表结构的表,每张表存储一部分数据。
二、分库分表原则
1、原则1:能不分就不分
MySQL是关系型数据库,数据库表之间的关系从一定角度映射了业务逻辑。任何分库分表的行为都会提升业务逻辑的复杂度,数据库除了承载数据的存储和访问外,协助业务更好地实现需求和逻辑也是其重要的工作之一。分库分表会带来数据的合并、查询、更新条件的分离,以及事物的分离等多种后果,业务实现的复杂度往往会翻倍或指数级上升。所以在分表分库之前,应先升级硬盘、内存、CPU、网络、版本、读写分离、负载均衡及SQL语句优化。
2、原则2:数据量太大,正常的运维影响业务访问
正常运维主要包括:
- 数据库的备份
- 数据表的修改
- 热点数据
3、原则3:表设计不合理
- 某个表字段不断被update,压力非常大
- 某个表字段存在TEXT或BLOB字段
4、原则4:某些数据表出现了无穷增长的情况
各种评论、消息、日志记录表现为不可控的增长,此时可按用户、时间、用途等进行水平拆分。