为什么要优化

首先了解一个概念,什么是·熵增·

物理定义:熵增过程是一个自发的由有序向无序发展的过程(Bortz, 1986; Roth, 1993)

在一个孤立的系统里,如果没有外力做工,其总混乱度(即熵)会不断增大,直至系统彻底变得无序

从系统软件的角度: 从应用系统上线那一刻开始,随着用户量的增加、业务功能的持续迭代,系统会面临各种不同程度的挑战,如果不及时采取优化措施,我们会发现诸多问题

比如:系统怎么越来越慢了,流量一高系统就卡顿、甚至宕机等等。

可以说,性能优化是贯穿在整个软件生命周期之中的

通常有哪些优化方法

在算法领域,评价一个算法的效率如何,主要会看它的时间复杂度和空间复杂度情况。

引用在数据库的优化中,

时间复杂度: 着重考量的是时间成本,效率。 通常理解成性能优化,如何让我的访问更快

空间复杂度: 着重考量的是资源成本。可对应结构优化,如果组织数据的存放。

那么,在做优化时,本质上也是从“优化时间”、“优化空间”、“时空互换(用时间换空间或用空间换时间)”三个方向去思考,然后在空间、时间上不停地做取舍。

优化衡量指标

系统优化的目标提高系统的吞吐量:单位时间内能够处理的请求数量

举个例子。把系统比作一个银行营业网点。 有多个窗口对外提供服务。 如何能够提高整体的处理量呢?

  • 空间 增加营业窗口

  • 时间 提高每个窗口的效率

关于空间的优化参见数据库优化思考 - 结构设计, 本篇更多思考的是性能(时间)的优化。

性能优化的衡量指标

响应时间(RT), 包括

  • 平均响应时间(AVG)

接口的平均处理能力, 但什么东西一平均很多就被平均了,如人均收入!😓。 不能很好反应真实情况。另一种类似中位数的指标。

  • 百分位数(Top Percentile)

一种统计学术语,反映的是超过n%的请求都在m时间内返回,一般用TPn=m来描述,比如:TP99=5,表示超过99%的请求都能在5ms内返回。

优化如何具体做

开发端:

  • 实现方法 条条大路通罗马,实现的功能是否只满足业务功能的需求,而没有考虑性能。

  • 索引 索引用的好,性能没烦恼。大部分应用端的性能问题都可以通过索引来改善。

索引本身也是一种空间换时间的手段。索引本身也是需要额外的代价。

  • 锁等待 最漫长的莫过于等待。

运维端:

通过性能指标监控验证优化成果,如

  • TPS
  • 慢sql
  • 缓存命中率
  • 频繁sql- top10
  • 不稳定sql - top10
  • 索引利用率
  • TPn

DBA:

通过执行计划对具体sql进行调优