参数优化 ===> 缓存、索引 ====> 读写分离====> 分库分表 (最终方案)
优点:
1.拆分后业务清晰(专库专用按业务拆分);
2.数据维护简单,按业务不同,业务放到不同机器上;
缺点:
1.如果单表的数据量,写读压力大;
2.受某种业务决定,或者被限制,也就是说一个业务往往会影响到数据库的瓶颈(性能问题,如双十一抢购);
3.部分业务无法关联join,只能通过java程序接口去调用,提高了开发复杂度;
优点:
1.单库/单表的数据保持在一定量(减少),有助于性能提高;
2.提高了系统的稳定性和负载能力;
3.拆分表的结构相同,程序改造较少;
缺点:
1.数据的扩容很有难度维护量大;
2.拆分规则很难抽象出来;
3.分片事务的一致性问题部分业务无法关联join,只能通过java程序接口去调用;
常见的取模、range、hash来拆分;
采用补偿事务,例如TCC来解决分布式事务问题;
用记录日志等方式来解决分布式事务问题;
将有E-R关系的表存储到一个库中;
对于数据量少的表建成全局表,分布到各个库中;
对于必须跨库join的,最多支持跨两张表的跨库join
利用Redis的incr命令生成主键;
用分布式id服务生成主键;
利用snowake算法生成主键。
分库分表的开源框架 jdbc 直连层:shardingsphere、tddl proxy 代理层:mycat,mysql-proxy(360)
jdbc直连层和proxy代理层优缺点