1、什么是垂直/水平拆分模式
垂直拆分:公司根据不同的业务来拆分成不同的数据库
应用场景:微服务(订单、会员、支付)
缺点:分布式事务问题
水平拆分:单张表数据量达到500w条,可能会遇到查询瓶颈,比如:分页和排序
将单张表数据放入到多个不同的数据库中,或者将单表拆分成N个子表存放进行查询
缺点:查询问题 分页/排序可能会引发内存溢出问题
2、基于客户端/服务器端实现分表分库区别
数据库中间件:mycat或者ShardingJDBC
基于服务器端-mycat:
优点:归并数据结果是完全解耦合,保证数据的安全性
缺点:效率偏低
基于客户端-ShardingJDBC
优点:效率高
缺点:归并数据结果没有实现解耦合,有可能会影响业务逻辑
原理:基于aop代理方式拦截改写sql
例如:select * from user -> select * from user_0, select * from user_1
3、单表达到多少数据量开始分表分库
【推荐】单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。
4、数据库分表分库策略有哪些
取余/取模
按照范围分片
按照日期进行分片
按照月份进行分片
按照枚举进行分片
二进制取模范围分片
一致性hash分片
按照目标字段前缀指定的进行分区
按照前缀ASCII码和值进行取模范围分片
二、项目实例1、application.yml
server:
port: 9091
mybatis-plus:
type-aliases-package: cn.itcloud.sharedingjdbc.entity
mapper-locations: classpath:mapper
@Data
@TableName("user") //逻辑表名称:user,分表为:user_01,user_02
public class User {
private Integer id;
private String userName;
private Integer age;
public User(Integer id, String userName, Integer age) {
this.id = id;
this.userName = userName;
this.age = age;
}
}
4、UserMapper-分页查询和排序
package cn.itcloud.sharedingjdbc.mapper; import cn.itcloud.sharedingjdbc.entity.User; import com.baomidou.mybatisplus.core.mapper.baseMapper; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper extends baseMapper{ @Select("select * from user") List getList(); @Select("select * from user limit 0,2") List getListPage(); @Select("select * from user order by id desc") List getListOrderBy(); @Select("select * from user where id = #{id}") List getListById(Integer id); }
项目源码:https://gitee.com/zqingcpu/SharedingJDBC.git



