什么是分库分表:

一个数据库分成多个库、一张表分成N小表

为什么需要分库分表:

业务越来越大,单表数据超出了数据库支持的容量。
持久化磁盘IO,传统的数据库性能瓶颈,业务需要必须这么做
改变程序。数据库下刀子切分优化
1、换数据库(缓存)
2、Sql、索引、字段优化
3、读写分离(业务有关优化)
4、分库分表(业务)
5、分区

读写分离:

什么是读写分离:我们一般应用程序访问数据库无非是读取数据、修改数据、插入数据、删除数据 CRUD。
分开》分库 前提条件:master》salve 主从(同步)架构 读写 互联网应用读多写少

分库分表常见方式:

垂直

通俗的说法叫做“大表拆小表”,拆分是基于关系型数据库中的“列”(字段)进行的。
字段拆分
特点:1、每个库(表)的结构都不一样
2、每个库(表)的数据都(至少有一列)一样

3、每个库(表)的并集是全量数据
image.png

订单里面一般订单id userid(互联网网站 用户为中心 userid)
查看我的订单
Select from orders where orderid=333 and userid=123
查看的订单列表
Select
from orders where userid=123 1库
查看的商品??购物车(用户)card

水平

以某个字段按照一定的规律(取模)讲一个表的数据分到多个库中
内容拆分
image.png


分库分表之后带来的问题:

读写分离:主从同步、数据一致性的问题、网络延迟的问题
分库分表:
增加了我们维护成本
分布式事务(跨库事务)
跨库join
分布式全局唯一ID(snowflake)

分库分表算法:

取模(Hash)通过userid用户表字段值进行123%3=xxxx 数据分散均衡,避免数据热点 一致性hash(扩容需要O(N))
范围区分(range)按月 按省 A(0-6)B(7-8)C(9 10)热点数据 11那天
预定义(list)(100w 1亿数据 10库)风投

常见的中间件:

开源中间件:sharding-sphere atlas 当当网 张亮、高洪涛 sharding-jdbc 2018
分两种类型:
Proxy代理:mycat(重)、mysql-proxy atlas、sharding-proxy(sharding-sphere )
Jdbc直连:TDDL(淘宝 半开源) 、sharding-jdbc(sharding-sphere )缺点 讲清楚
不分上下