来自支付宝资深数据库架构师童家旺给你们分享的关于数据存储性能优化的一点想法,他从本身的我的经验中总结了关于数据库存储的性能优化。 算法
▲支付宝资深数据库架构师童家旺 数据库
首先,童家旺介绍了他认为的什么是优化: 后端
第1、作任何事情最快的方法就是什么也不作。 缓存
第2、不访问没必要要的数据:使用B*Tree/hash等方法定位必要的数据。使用column Store或分表的方式将数据分开存储。使用Bloom filter算法排除空值查询。 性能优化
第3、合理的利用硬件来提高访问效率:使用缓存消除对数据的重复访问。使用批量处理来减小磁盘的Seek操做。使用批量处理来减小网络的Round Trip。使用SSD来提高磁盘访问效率。 网络
响应时间和吞吐量之间的关系 架构
一、性能。衡量完成特定任务的速度或效率。 工具
二、响应时间。衡量系统与用户交互式多久可以发出响应。 性能
三、吞吐量。衡量系统在单位时间里能够完成的任务量。 优化
▲反应时间
▲传统磁盘的访问特性
B*Tree优化数据访问介绍
▲B*Tree优化数据访问
B*Tree优化数据访问模拟场景
▲B*Tree优化数据访问模拟场景
童家旺经过阿里巴巴的真实应用场景介绍了如何用分表存储来提升性能。
1、场景介绍:
2、要求:
3、性能分析
一、每块记录数
8192 * 0.80(1) / 250 = 25.5 (主表)
8192 * 0.80 / 2000 = 3.27(详情表)
8192 * 0.80 / ( 2000 + 250 ) = 2.91
二、访问的逻辑IO(内存块访问)
List的查询代价
改进后=( 300/25.5 ) * y + 4 + x = 4 + x + 11.8y = 4(2) + 7(3) + 11.8 * 1.5(4) = 28.7
改进前=( 300/2.91 ) * y + 4 + x = 4 + x + 103.y = 4 + 7 + 103 * 1.5 = 165.5
三、访问涉及到的物理读(磁盘块访问)
List的查询代价(逻辑IO * ( 1 – 命中率 ))
改进后=28.7 * ( 1 – 0.85(5)) = 4.305
改进前=165.5 * ( 1 – 0.85 ) = 24.825
四、访问时间(ms)
改进前=逻辑IO时间+物理IO时间= 28.7 * 0.01(6) + 4.305 * 7(7) = 30.422ms
改进后=逻辑IO时间+物理IO时间= 165.5 * 0.01 + 24.825 * 7 = 175.43ms
场景
要求
方案
注意事项
参考缓存工具
MemCached, Tair, Redis
【编辑推荐】