分库分表的几种方式

垂直分表、垂直分库、水平分表、水平分库

垂直分表

按照字段拆分,增加页内能存储的的行数据来减少IO的次数,以及减少对行锁竞争

垂直分库

按照业务拆分,减少业务间的耦合,转库专用,不同业务的库可以部署在不同服务器减少对硬件资源的压力

水平分库

解决单库数据量大问题,把单库数据平摊到多个库,可以用ID取模或者hash确定数据在哪个数据库,减小单库的压力

和垂直分库对比

垂直分库是根据业务把不同业务的表拆分到不同数据库

水平分库是把相同业务的表复制一份到不同数据库

水平分表

解决单表数据量大问题,把单表数据平摊到多个表,减小单表数据量,减少IO

总结

在系统设计的时候,就要根据需求,设计好垂直分库分表

在业务上线后,如果数据量增大,先考虑用缓存、读写分离、索引等方式优化,如果业务数据量持续增大,再考虑用水平分库分表

分库分表带来的一些问题

事务一致性问题

需要操作多个数据库的时候,需要分布式事务

跨界点关联查询

由于表在不同数据库内,在写SQL语句的时候无法通过联表查询

跨节点分页、排序函数

由于表在不同数据库内,在写SQL语句的时候需要查询多次,在内存中排序

主键避重

不同数据库主键重复问题,分布式ID

公共表

每个数据库都有一些公共表,公共表的数据一致性问题

Sharding-JDBC流程

SQL解析

将SQL语句根据单词拆分解析成语法树,树节点包括关键字、变量等

在这里就可以确定哪些是需要被替换的逻辑表

SQL路由

将逻辑表映射到真实的物理节点

尽量使用分片键进行路由,WHERE条件包括 = 、IN 、BETWEEN,否则会走全局路由(扫描所有库同名的所有表),联表的话不用分片键也会产生笛卡尔积

总的来说,分片键配合分片策略可以很好的减少SQL查询的行数,加快查询速度

SQL改写

将逻辑表改写为真实表

如果有排序条件,将排序条件补充到查询条件中

SQL执行

内存限制模式

不限制数据库连接数,多线程处理,加快查询速度

连接限制模式

限制数据库连接数,通常用于事务控制

结果归并

如何编写分库分表配置文件

配置数据源

配置主从关系