一、ShardingSphere-JDBC的应用场景

对于使用关系型数据库的应用、当数据达到一定量级时,使用一般的手段 例如:添加索引、优化业务流程、优化代码、或者增加机器性能已经很难再提高查询数据的时候 这种情况下可以考虑分库分表来处理。

(具体数据量根据具体业务场景是有很大区别的 普通的业务查询逻辑(例如简单的单表或者两个表联表查询)一般数据量在千万级别左右使用合适的索引 查询速度还是很可观的 、 对于复杂的业务逻辑例如sql的多个连表查询或者子查询较多的情况下可能几百万数据量就会出现查询速度很慢且难以优化的情况)

二、分库、分表的概念

分库:将原本一个大数据量的数据库 分成若干个小数据量的数据库 达到降低单个数据库总数据量的目的 从而提高数据库处理数据的性能 提高查询速度

分表:将一个大数据量的表 拆分成若干个小数据量的表 拆分的表结构和原表结构相同 若干个小数据量的表数据量总和等于原未拆分的大表数据量 目的是使得单一数据表的数据量变小 提升数据库的性能 从而提高查询速度

三、分库、分表的方式

  • 垂直分库:
    可以根据业务分库 例如电商系统:将数据库分用户库、商品库、店铺库等 每个库专门存放特定的业务数据

  • 垂直分表:
    也就是按照业务字段进行拆分表 例如 商品表 有商品基本信息字段 商品详情信息字段 可以把基本信息放一张表 详情信息放一张表 然后通过某一个字段进行关联

  • 水平分库
    当商品库数据量过大的时候 此时再创建一个商品数据库2 与原商品数据库的数据结构相同 此时通过某种规则将部分数据存入商品库2来分担原商品库的数据量
    (注意 库分多了 不方便运维)

  • 水平分表
    将商品表 分为商品表1 商品表2 商品表3 3个表的 表结构一样

一般情况下:在业务系统设计的时候就要考虑到垂直分表或者垂直分库的应用,当数据量增加到一定程度的时候,应优先考虑索引、缓存、读写分离等方式来解决查询速度问题、如果数据量已经达到上述方式很难解决查询速度问题时 并且数据量还在持续增长的情况下 此时考虑水平分库分表方案解决查询速度问题

四、分库分表会带来哪些问题?(后面再看ShardingSphere-JDBC是如何处理这些问题的)

1、数据放在不同的库 不同的服务器 带来的分布式事务问题

2、跨数据库的关联查询问题

3、跨数据库的分页查询 排序问题

4、不同数据库,不同表之前 主键id重复的问题

5、公共表如何处理(即数据量不大 多用于关联查询使用的表)