分库分表

分库分表是什么

为什么要分库分表?

分库分表的方式

垂直分表

按字段使用频率的高低来拆分表, 频率高的字段放入同一张表, 频率低的字段放入另一张表.

优点

  • 数据库以页为存储单位, 单页内数据行越多, 数据库性能越好
  • 数据库以行为单位将数据加载到内存中

垂直分库

针对不同的业务, 将表进行分类, 不同类的表可以存放在不同的数据库上. 并且每个不同的数据库可以存放在不同的服务器上. ==核心理念是专库专用==.

优点

  • 解决了业务层面上的耦合, 业务清晰
  • 能够对不同业务的数据进行分级管理, 维护, 监控, 扩展等
  • 高并发场景下, 垂直分库一定程度的提升了IO, 数据库连接数, 降低了单机硬件资源的瓶颈

水平分表

把同一个表的数据按照一定的规则拆分到不同的表中

  • id范围(0->1000, 1000->2000)
  • id取模

水平分库

分库分表带来的问题

分布式事务问题

分库分表将数据存储在不同数据库甚至不同服务器上, 因此会造成==分布式事务问题==.

(Sharding-JDBC不能解决分布式事务问题, 需要从其他方面考虑)

跨节点关联查询

不在同一个数据库, 甚至不在同一台服务器, 因此无法进行关联查询.

需要将原来的关联查询分为两次查询

跨节点分页, 排序等

假设要取成绩最高的10条数据, 那么需要将每个数据库中成绩最高的10条数据查找出来, 然后在该结果集中再次查找.

主键避免重复

分库分表造成不同的表可以出现相同的主键, 但是这些表逻辑上属于同一张表, 不应该出现相同的主键.

公共表

不同的表都需要依赖这些公共表. 例如不同的应用程序有依赖于手机的位置访问权限, 例如高德地图, 百度地图, 美团外卖.

对分库分表数据库的操作Sharding-JDBC

Sharding-JDBC不是如何去进行分库分表的工具, 而是在已经进行了分库分表的数据库中进行处理的工具.

Sharding-JDBC的核心功能是数据分片和读写分离. Sharding-JDBC可以透明的访问. 程序员不需要关注数据的分布, 在使用上相当于一张无限大的单表.

==对于机器, 单表会造成性能瓶颈, 所以需要拆分, 即分库分表. 对于应用程序员, 不希望关注数据表的存储等细节, 希望看到的是一张无限大的表, 因此通过Sharding-JDBC来简化分库分表之后的数据库操作, 相当于封装了一层.==

Sharding-JDBC使用

快速入门案例

  1. 数据库准备, 创建表order_1, order_2

    CREATE DATABASE `shardingjdbc`;
    CREATE TABLE `order_1`
    (
        `order_id` bigint(20)                     NOT NULL COMMENT '订单id',
        `price`    decimal(10, 2)                 not null comment '订单价格',
        `user_id`  bigint(20)                     not null comment '用户id',
        `status`   varchar(50) character set utf8 not null comment '订单状态',
        primary key (`order_id`) using btree
    ) character set utf8
      row_format dynamic;
    
    CREATE TABLE `order_2`
    (
        `order_id` bigint(20)                     NOT NULL COMMENT '订单id',
        `price`    decimal(10, 2)                 not null comment '订单价格',
        `user_id`  bigint(20)                     not null comment '用户id',
        `status`   varchar(50) character set utf8 not null comment '订单状态',
        primary key (`order_id`) using btree
    ) character set utf8
      row_format dynamic;
  1. 使用Sharding-JDBC对水平分表后的user表进行操作

   转载规则


《》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
通用接口public interface XConfig { Properties properties = new Properties(); default Properties getProperties() {
2022-11-11
本篇 
分库分表分库分表是什么为什么要分库分表? 分库分表的方式垂直分表按字段使用频率的高低来拆分表, 频率高的字段放入同一张表, 频率低的字段放入另一张表. 优点 数据库以页为存储单位, 单页内数据行越多, 数据库性能越好 数据库以行为单位将
2022-11-11
  目录