传统数据库瓶颈解决:分库分表

什么是分库分表:

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

不把鸡蛋放在一个篮子里

 

为什么需要分库分表:

业务越来越大,单表数据超出了数据库支持的容量。

持久化磁盘IO,传统的数据库性能瓶颈,产品经理业务必须这么做

改变程序。数据库下刀子切分优化

  1. 换数据库(缓存)
  2. Sql、索引、字段优化
  3. 读写分离(业务有关优化)
  4. 分库分表(业务)
  5. 分区

读写分离:

  什么是读写分离:我们一般应用程序访问数据库无非是读取数据、修改数据、插入数据、删除数据  CRUD。

分开》分库 前提条件:master》salve 主从(同步)架构 读写 互联网读多写少

Insert orders 1 select orders N

 

分库分表常见方式:

垂直

通俗的说法叫做“大表拆小表”,拆分是基于关系型数据库中的“列”(字段)进行的

字段拆分

特点:1、每个库(表)的结构都不一样

               2、每个库(表)的数据都(至少有一列)一样

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

 传统数据库瓶颈解决:分库分表

 

1、其实没太理解垂直拆分为什么要改表结构,之前在一个库里的时候 订单会员这种业务表之间也是要关联的啊?

2、根据用户id分,会不会出现数据不平衡的情况 平衡

3、根据用户分,会不会出现数据不平衡的情况

4、老师,不明白刚刚分库的时候会有那种 链表查询,这个垂直分库不也是按数据内容分库吗 ???

5、电商系统的订单量会很大,订单表数据也大,在分表的时候如果是对订单id作为分表规则,那么在查询某个用户的订单会涉及到很多个表的数据。相反,也会有同样的问题,问下老师如何解决?

订单里面一般订单id userid(互联网网站 用户为中心 userid)

查看我的订单

Select * from orders where orderid=333 and userid=123

查看的订单列表

Select * from orders where userid=123  1

查看的商品??购物车(用户)card

 

水平

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

内容拆分

传统数据库瓶颈解决:分库分表

 

 

 

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

读写分离:主从同步、数据一致性的问题、网络延迟的问题

分库分表:

增加了我们维护成本

分布式事务(跨库事务)

跨库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 )缺点 讲清楚

不分上下