关系数据库
读写分离
一主一从,一主多从,主负责读写,从只负责读
问题:主从延迟
解决:
- 写后读主
- 读从失败后读主
- 关键业务都在主上,非关键业务读写分离
分库
按业务模块将数据拆分到不同的库
问题:join、事务、成本
- 程序写逻辑查多个库后进行join
- 引入分布式事务(MySQL XA),会降低性能,或者放弃事务
- 分库后,无法利用数据库自己的join和事务,业务逻辑也需要额外写很多,增加工作量
分表
垂直分表
将表中不常用的列分出去,用主键关联多个表,提升单表性能,不过会增加查询次数。
水平分表
适合单表上千万条数据时使用,比垂直分表更复杂,需要增加路由算法。
常见路由算法:范围路由、Hash路由、配置路由
join操作:需要程序多次join
count:对多个表进行count,建议转换为记录数表,更合理
order by:程序查多个表汇总排序
实现方案
代码封装
抽象出一个数据访问层专用于实现读写分离或者分库分表
实现简单,但不同语言不通用
中间件
MySQL Router,支持多种变成语言,支持标准SQL协议,业务无感知,但中间件的实现很复杂
NoSQL:Not Only SQL
KV存储:解决关系数据库无法存储数据结构的问题,以Redis为代表。
文档数据库:解决关系数据库强schema约束问题,以MongoDB为代表。
列式数据库:解决关系数据库大数据场景下I/O问题,以HBase、ClickHouse为代表。
全文搜索引擎:解决关系数据库的全文索引性能问题,以Elasticsearch为代表。
缓存
适用于读多写少,一次读取,多次使用的场景,能极大提升访问速度。
缓存穿透:查询的数据不存在,每次访问数据库
- 缓存空值
- 加布隆过滤器缓解
缓存雪崩:大量缓存同时失效或者过期
- 加更新锁,单线程更新
- 后台更新,业务线程和更新线程分离
缓存热点:热点数据访问压力大
对热点数据缓存多份,访问时分布式随机访问
本文暂时没有评论,来添加一个吧(●'◡'●)