00ef669b0f503f000ac59eaaa5d2eb2a
(一) 在说数据库优化时,我们应该做些什么?

00 优化之前我们应该做什么?

在说数据库优化时,我们应该做些什么呢?

我们在优化之前一定要了解数据库内部原理吗?

要去不断调整数据库、操作系统的参数呢?

数据库的性能就只是数据库的架构决定的,跟应用、开发关系不大吗?

我们是不是必须遇到了瓶颈要做读写分离、分库分表呢?

NO!

其实,它们可能都是数据库优化的一部分,但既不是开始,也不是目的,更不是全部。

我们首先要搞懂,为什么要做数据库的优化?

从业务角度出发,是为了减少用户响应时间。

从数据库角度看,是为了减少数据库SQL响应时间。

从数据库的服务器角度来说,是为了充分使用数据库服务器物理资源,减少CPU、IO、内存的使用率。

我们在优化之前,一定要给出一个目标。

  • 响应时间变短,优化前数据库的平均响应时间是500ms,指定优化目标缩减到200ms。

  • CPU占用率变少,优化前高峰期使用率70%,优化后变成50%。

  • IO使用率变低,优化前IO WAIT 30%,优化后10%。

  • SQL执行时间变短,优化前1000条SQL执行为3600s,优化后降到200s。

还有其他诸如硬解析率、软解析率、TPS压测值,也都可以作为一个指标。

至于指标到底怎么定?我们接下来继续说。

01 做数据库优化有流程吗?

我们应该制定一个什么样的流程,来做数据库优化?

或者说,我们做数据库优化时,应该要经过一个什么流程呢?

如图:

优化流程

优化流程

1、我们首先应该了解待优化的问题;
【到底出了什么问题?】

2、收集系统信息;
【哪里出了问题?】

3、制定优化目标;
【得到客户认可,解决什么问题?】

4、分析性能问题;
【具体的问题在哪里?什么原因引起的问题?】

5、制定优化方案;
【针对分析出的问题怎么去解决?】

6、实施优化方案;
【谁来实施?怎么实施?有没有风险?】

7、判断是否达到优化目标;
【效果怎么样?如果不行还需要重新分析问题。】

8、编写优化报告。
【目标达到,我们要编写优化报告,告诉客户解决了什么问题。】

以上,便是我们数据库优化的一个大体流程。

接下来具体说说怎么做。

02 信息收集与目标制定

首先,我们要了解待优化的问题。

从哪里了解?用户、运维、开发人员等等。

我们一般能了解到什么信息?

用户一般会说应用访问慢、系统卡、打不开等等。

运维人员会说服务器的硬件资源占用率高,如CPU很高、内存不够了等等

开发人员会说接口总是报错,数据库响应时间变得很长,TPS、QPS压不上去。

那么,这些信息都是真实有效的吗?

我们在这里谨记一个守则:凡是“判断”、“分析”类的信息统统屏蔽,凡是“症状”、“表现”类的信息细细保留。

why?

因为别人的“判断”,特别是来自以上三类人群的“判断”,大部分是片面的,很可能会干扰你的思路,甚至会把你带到沟里去,让你对某些问题视而不见,导致做了大半天的无用功。

我们要有一套自己的优化思路。

在了解到当前待优化的问题后,我们紧跟着要干什么?开始优化吗?

当然不是。

而是最基本的,来到第二步,收集系统信息。并且尽可能全面地收集系统信息。

我们可以从业务、数据库、服务器等角度收集系统信息。分类保存,以便后期优化时使用。

然后才是我们前面章节所说的,制定优化目标。

怎么制定优化目标?

首先是分析数据库大概存在的瓶颈,然后是制定明确的优化目标(如业务、数据库、服务器等多种角度)。

最重要的是,优化前一定要跟客户沟通好,让客户确认本次优化的目标,得到认可。

再接着,就是具体地分析性能问题了。

03 问题分析

问题分析这一块可以说的内容太多了,所以单独放了一小节。

首先,我们可以采用自上而下的顺序进行分析。

操作系统(CPU、IO、NETWORK)
 -> 数据库实例
  -> 数据库对象
   -> SQL

对操作系统我们采用什么工具呢?我们现在的服务一般都是部署在Linux上的,所以我们一般使用以下这些工具进行检测。

  • SAR
  • HTOP
  • NMON
  • TOP
  • ETHTOOL
  • ……

那对于数据库,我们有什么工具来分析数据库的等待时间瓶颈呢?

  • ORACLE:AWR、STATSPACK、内部视图、GRID CONTROL、STA、SAA、ADDM
  • MYSQL:慢日志、PERCONA TOOLKIT、MEM、内部视图……
  • SQLSERVER:SQL PROFILE、内部视图……
  • POSTGERS:pg_stat_statements、SQL trace……
  • 达梦:AWR、内部视图、监控工具、SQL trace……

在使用上面的工具对操作系统、数据库进行信息收集、初步分析后,我们紧接着就要根据找到的瓶颈进行深入分析。

从哪些方面分析?

  • 操作系统参数是否配置合理?
  • 数据库参数是否合理?
  • 索引设计合理吗?
  • 数据库有没有bug?排除下
  • 捕获主要的问题SQL,对其进行深入分析
top Created with Sketch.