传统数据库瓶颈解决:分库分表
什么是分库分表:
一个数据库一张表分成N小表
不把鸡蛋放在一个篮子里
为什么需要分库分表:
业务越来越大,单表数据超出了数据库支持的容量。
持久化磁盘IO,传统的数据库性能瓶颈,产品经理业务必须这么做
改变程序。数据库下刀子切分优化
- 换数据库(缓存)
- Sql、索引、字段优化
- 读写分离(业务有关优化)
- 分库分表(业务)
- 分区
读写分离:
什么是读写分离:我们一般应用程序访问数据库无非是读取数据、修改数据、插入数据、删除数据 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 )缺点 讲清楚
不分上下