版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31463999/article/details/87966964
文章目录
1.什么是分库分表
一个数据库一张表分成N小表(不把鸡蛋放在一个篮子里)
2.为什么需要分库分表
业务越来越大,单表数据超出了数据库支持的容量。
持久化磁盘IO,传统的数据库性能瓶颈,产品经理业务必须这么做改变程序。数据库下刀子切分优化。
其他解决方案
- 换数据库(缓存)
- Sql、索引、字段优化
- 读写分离(业务有关优化)
- 分库分表(业务)
- 分区
2.1 读写分离
什么是读写分离:我们一般应用程序访问数据库无非是读取数据、修改数据、插入数据、删除数据 CRUD。
分开–>分库
前提条件:master–>salve 主从(同步)架构 读写 互联网读多写少
Insert orders 1 select orders N
3.分库分表常见方式
3.1 垂直(字段拆分)
通俗的说法叫做“大表拆小表”,拆分是基于关系型数据库中的“列”(字段)进行的。
3.1.1 特点
- 每个库(表)的结构都不一样
- 每个库(表)的数据都(至少有一列)一样
- 每个库(表)的并—全量数据
3.1.2 优点
- 拆分后业务清晰(专库专用按业务拆分)
- 实现动静分离、冷热数据分离设计体观。冷库:发布说说信息 热:说说点赞评论数据
- 数据维护简单、按业务不同业务放在不同机器上
3.1.3 缺点
- 如果单表的数据量大、写读压力大
- 受某种业务来决定、或者被限制。也就是说一个业务往往会影响到数据库的瓶頭(xing能问题)
- 部分业务无法关联join、只能通java程序接口去调用,提供了开发复杂度。(商品、订单信息、 会员信息)
3.2 水平(内容拆分)
以某个字段按照一定的规律(取模)讲一个表的数据分到多个库中
扫描二维码关注公众号,回复:
6105656 查看本文章
3.2.1 特点
- 每个库(表)的结构都一样
- 每个库(表)的数据都不一样
- 每个库(表)的并集是全量数据
3.2.2 优点
- 单库(表)的数据保持在一定的量(减少),有助于性能提高
- 提高了系统的稳定性和负载能力。
- 切分的表的结构相同、程序改造较少
3.2.3 缺点
- 数据的扩容很有难度维护量大
- 拆分规则很难抽象出来
- 分片事务的一致性的问题部分业务无法关联join、只能通java程序接口去调用
4.分库分表之后带来的问题
- 读写分离:
主从同步、数据一致性的问题、网络延迟的问题 - 分库分表:
- 增加了我们维护成本
- 分布式事务(跨库事务)
- 跨库join
- 分布式全局唯一ID(snowflake雪花算法)
5.分库分表算法
- 取模(Hash):通过userid用户表字段值进行123%3=xxxx 数据分散均衡,避免数据热点
缺点是扩容复杂,于是推出了一致性hash(解决扩容需要O(N)) - 范围区分(range):按月 按省 A(0-6)B(7-8)C(9 10)
问题:热点数据11那天 - 预定义(list):(100w 1亿数据 10库)风投问题
6.常见的中间件
开源中间件:
- sharding-sphere
- atlas
- sharding-jdbc
分两种类型:
Proxy代理:mycat(重)、mysql-proxy atlas、sharding-proxy(sharding-sphere )
Jdbc直连:TDDL(淘宝 半开源) 、sharding-jdbc(sharding-sphere )