垂直分库
根据业务对系统的表进行拆分形成不同的模块,为不同的模块分配不同的数据库
垂直分表
表的字段很多、存在大文本字段,在查询的时候对数据库的IO产生很大的影响,如果涉及到主从复制也会存在延迟的风险。
对当前表的列进行拆分,1、对经常使用的列和不经常使用的列进行拆分 2、大文本的列进行拆单独存储
水平分表
在同一个数据库中,按照相关策略把数据拆分存入到不同的表中,因为是在同一个数据库中,所以还是会存在数据库的IO性能问题,不建议在同一个数据库中进行分表操作
相比于单库的水平分表,更彻底
按照时间进行拆分(流水)
按照地域进行拆分
按照ID的大小进行拆分
按照分片键的HASH取模拆分(推荐使用,注意分片键使用查询频率最高的列)
选择用户的ID为分片键对用户的信息进行水平拆分,但是用户在登录的时候往往用的是账号进行登录,如果按照账号直接进行查询的话走所有的库进行扫描
新增一张中间表(用户的账号、用户的ID),以用户的账号为分片键进行拆分,先用账号从中间表中查询出ID,再用ID在用户表中查询出相关信息(以空间换时间)
用户购买商品生成订单,根据用户账号查询商品信息,根据商品编号查询所有用户信息。
分别新增中间表1(用户账号、商品编号),以用户账号为分片键进行拆分、中间表2(商品编号、用户账号),以商品编号进行拆分
水平分表带来的问题
- 跨库JOIN问题:把相关关建字段冗余到表中。订单表中冗余用户账号、用户地市、商品编号、商品名称等等
- 分组、排序问题
- 分布式事务问题:seata分布式中间件