一、高性能方案:
1.读写分离:
设计初衷:分散访问压力(没有分散存储压力)
基本实现:主从集群,主负责写,从负责读,主同步数据到从机
引入问题:主从同步延迟(注册后无法读取数据)
解决方法:关键任务都读写到主机上(注册,登陆),非关键业务采取读写分离。
2.分库分表:
设计初衷:分散访问和存储压力(千万,亿级时单机瓶颈,备份成本,数据丢失风险)
基本实现:
1.业务分库:(初创团队不适用,后期做起来资源多后再提升)
引入问题:无法join,事务复杂度和性能问题,成本问题
2.分表:
-
a.垂直分表:解决访问字段频率不一致的问题,提升性能
引入问题:表操作数量增加
-
b.水平分表:(行数>5000万可以考虑进行分表)
引入问题:分布式会引入路由复杂度,join的次数up,count访问次数up(记录数表,用一 张表记录count这些常用汇总数据),order by操作只能在业务层做 解决方法:程序代码封装和中间件封装
二、数据库分类及优缺点:
1.关系数据库(MySQL):
优点:强大的SQL和ACID属性
缺点:无法存储数据结构,schema(表结构)扩展不方便,I/O较高,全文搜索较弱
2.NoSQL(牺牲ACID-原子,一致,隔离,持久):
-
a.K-V存储(Redis):解决数据结构的问题,提供数据结构的能力,主要牺牲A和D
-
b.文档数据库(MongoDB):解决schema问题,新增字段简单,历史数据不会出错,存储 复杂数据,主要牺牲A,无法做join,一般用作对mysql的辅助
-
c.列式数据库(HBase,ClickHouse):解决大数据场景I/O问题,拥有更高的压缩效率,不 适用于频繁更新的业务,适用数据统计及分析(人物画像),牺牲AC
-
d.全文搜索引擎(Elastic Search):解决全文搜索慢的问题(倒排索引),高可用,扩展性,牺牲了C