一、What:
读性能指服务层读取数据库数据的性能,通常读取性能指标有sql查询QPS、sql查询响应时间。
二、Why:
为什么要提升读性能呢?因为大部分的互联网产品都是读多写少,所以最容易碰到的场景就是数据库读遇到瓶颈,所以解决数据库的读性能是首当其冲的。
三、How:
-
方法论:
a. 优秀的表设计:根据“业务模式”,设计表结构;根据“访问模式”,设计索引结构
b. 冗余多台来负载均衡:数据库读写分离分组架构,多台Slave负载均衡读请求
c. 缓存:redis前置分担读请求 -
具体方案一:不同Slave不同索引
设计一个读写分离分组架构,主库没有索引,从库slave01只包含field01的索引提供给服务A读,从库slave02只包括field01和field02的索引提供给服务B读。这样的好处有:
a. 主库没有索引,所以写表的时候,不用维护B+树(每个索引都会对应一个B+树)
b. 不同的从库使用不同的索引,可以解决内存空间给到数据页的缓存,增加命中率,从而提高读性能。 -
具体方案二:添加从库
a. 添加从库的方式来扩展读性能,多个从实现了读的高可用,但是写并没有高可用。
b. 带来的新问题:主从一致性问题 -
具体方案三:添加缓存
a. 带缓存的读流程:- 上游先访问缓存,如果缓存里有数据,则取数据后直接返回
- 如果缓存里没有数据,则访问数据库
- 再把取到的数据放入缓存
b. 带来的新问题:缓存和数据库的不一致