【MySQL】高级之分库分表

在这里插入图片描述

1 为什么要分库分表

当MySQL存储的数据量变得很大时,单体的 MySQL 无法承载高并发;这时可以对数据库做一系列的优化,其中就可以用分库分表来解决这一问题;下面介绍一些优化措施;
1、换数据库 NoSQL;
2、sql 优化,添加索引;
3、部署 MySQL 主从,读写分离;
4、分库分表

2 什么是分库分表

分库:将一个库中的表分散到不同的库里面;
分表:将一个表中的数据分散到不同的表里面:

3 分库分表的几种方式

3.1 垂直方式

3.1.1 垂直分库

按照业务模块区分库,例如电商业务中可以将数据库分为:“订单库”、“会员库”、“商品库”等等。

3.1.2 垂直分表

将一张表的多个字段分为两部分:
在这里插入图片描述
上图中将 user 表分成两个表,一个是 user_base 表(适用于用户登录);一个是 user_info 表(适用于用户查看或修改个人信息);

3.1.3 特点

  1. 每个库(表)的结构都不一样;
  2. 每个库(表)的数据中至少有一列一样;
  3. 每个库(表)的并集是全量数据;

3.1.4 优点

  1. 拆分后业务清晰(专库专用按业务拆分);
  2. 数据维护简单、按业务不同放到不同机器上;

3.1.5 缺点

  1. 如果单表的数据量大,那它的读写压力还是很大;
  2. 部分业务无法关联;

3.2 水平方式

3.2.1 水平分库

如下图所示:将会员库分成两个库,存放数据时可以根据用户id来决定放到哪一个库(比如 0-500放到库1,500-1000放到库2;又或者计算id % 2的结果来决定存放位置)
在这里插入图片描述

3.2.2 水平分表

分表的思路与分库类似,也是根据表中的某一值来进行分库,重点保证两个表中的数据量保持平衡
在这里插入图片描述

3.3 特点

  1. 每个库(表)的结构都一样;
  2. 每个库(表)的数据都不一样;
  3. 每个库(表)的并集是全量数据;

3.4 优点

  1. 单库(表)的数据保持在一定的量,有助于提高性能;
  2. 拆分的表的结构相同、程序改造较少;

3.5 缺点

  1. 数据扩容难度大(涉及数据拆分规则更改及已有数据迁移问题);
  2. 部分业务无法关联,只能使用程序调接口完成数据关联;

4 分库分表带来的问题

4.1 分布式事务问题

4.2 跨库 join 查询

4.3 分布式全局唯一 id

使用开源框架解决问题
jdbc 直连层:
数据分片规则定义在java程序中,它的性能高于 proxy 代理,且支持跨数据库(前提是数据库支持 jdbc 协议);
shardingsphere (京东)
tdd1 (淘宝,部分开源)

proxy 代理层:
数据分片规则定义代理插件上,虽然它的性能不如 jdbc 直连层,但是 proxy 它支持跨语言;
mycat (开源社区)
mysql-proxy (官方开源插件) 【atlas-基于 mysql-proxy 开发的插件,它属于360】

读写分离原理剖析与实践

分库分表实战与源码分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值