一、优化的哲学

1、优化可能带来的问题?

  • 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统;

  • 优化手段本来就有很大的风险,只不过你没能力意识到和预见到;

  • 任何的技术可以解决一个问题,但必然存在带来一个问题的风险;

  • 对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果;

  • 保持现状或出现更差的情况都是失败!

2、优化的需求?

  • 稳定性和业务可持续性,通常比性能更重要;

  • 优化不可避免涉及到变更,变更就有风险;

  • 优化使性能变好,维持和变差是等概率事件;

  • 切记优化,应该是各部门协同,共同参与的工作,任何单一部门都不能对数据库进行优化

所以优化工作,是由业务需要驱使的!

3、优化由谁参与?

在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人员、硬件及系统管理员、存储管理员等,业务相关人员共同参与。

二、优化思路

1、优化什么?

在数据库优化上有两个主要方面:即安全与性能。

  • 安全->数据可持续性;

  • 性能->数据的高性能访问。

2、优化的范围有哪些?

存储、主机和操作系统方面:

  • 主机架构稳定性;

  • I/O规划及配置;

  • Swap交换分区;

  • OS内核参数和网络问题。

应用程序方面:

  • 应用程序稳定性;

  • SQL语句性能;

  • 串行访问资源;

  • 性能欠佳会话管理;

  • 这个应用适不适合用MySQL。

数据库优化方面:

  • 内存;

  • 数据库结构(物理&逻辑);

  • 实例配置。

说明:不管是设计系统、定位问题还是优化,都可以按照这个顺序执行。

3、优化维度?

数据库优化维度有四个:

硬件、系统配置、数据库表结构、SQL及索引。

优化选择:

  • 优化成本:硬件>系统配置>数据库表结构>SQL及索引。

  • 优化效果:硬件<系统配置<数据库表结构<SQL及索引。

三、优化工具有啥?

1数据库层面?

检查问题常用工具:

1)MySQL

2)msyqladmin:MySQL客户端,可进行管理操作

3)mysqlshow:功能强大的查看shell命令

4)show [SESSION | GLOBAL] variables:查看数据库参数信息

5)SHOW [SESSION | GLOBAL] STATUS:查看数据库的状态信息

6)information_schema:获取元数据的方法

7)SHOW ENGINE INNODB STATUS:Innodb引擎的所有状态

8)SHOW PROCESSLIST:查看当前所有连接session状态

9)explain:获取查询语句的执行计划

10)show index:查看表的索引信息

11)slow-log:记录慢查询语句

12)mysqldumpslow:分析slowlog文件的

不常用但好用的工具:

1)Zabbix:监控主机、系统、数据库(部署zabbix监控平台)

2)pt-query-digest:分析慢日志

3)MySQL slap:分析慢日志

4)sysbench:压力测试工具

5)MySQL profiling:统计数据库整体状态工具

6)Performance Schema:MySQL性能状态统计的数据

7)workbench:管理、备份、监控、分析、优化工具(比较费资源)

关于Zabbix参考:

http://www.cnblogs.com/clsn/p/7885990.html

2数据库层面问题解决思路?

一般应急调优的思路:针对突然的业务办理卡顿,无法进行正常的业务处理,需要立马解决的场景。

1)show processlist;

2)explain  select id ,name from stu where name='clsn'; # ALL  id name age  sex;

select id,name from stu  where id=2-1 函数 结果集>30;show index from table;

3)通过执行计划判断,索引问题(有没有、合不合理)或者语句本身问题;

4)show status  like '%lock%';    # 查询锁状态

kill SESSION_ID;   # 杀掉有问题的session。

常规调优思路:针对业务周期性的卡顿,例如在每天10-11点业务特别慢,但是还能够使用,过了这段时间就好了。

1)查看slowlog,分析slowlog,分析出查询慢的语句;

2)按照一定优先级,一个一个排查所有慢语句;

3)分析top SQL,进行explain调试,查看语句执行时间;

4)调整索引或语句本身。

3系统层面?

Cpu方面:

vmstat、sar top、htop、nmon、mpstat;

内存:

free、ps-aux;

IO设备(磁盘、网络)

iostat、ss、netstat、iptraf、iftop、lsof;

vmstat命令说明:

1)Procs:r显示有多少进程正在等待CPU时间。b显示处于不可中断的休眠的进程数量。在等待I/O。

2)Memory:swpd显示被交换到磁盘的数据块的数量。未被使用的数据块,用户缓冲数据块,用于操作系统的数据块的数量。

3)Swap:操作系统每秒从磁盘上交换到内存和从内存交换到磁盘的数据块的数量。s1和s0最好是0。

4)Io:每秒从设备中读入b1的写入到设备b0的数据块的数量。反映了磁盘I/O。

5)System:显示了每秒发生中断的数量(in)和上下文交换(cs)的数量。

6)Cpu:显示用于运行用户代码,系统代码,空闲,等待I/O的Cpu时间。

iostat命令说明:

实例命令:iostat -dk 1 5

       iostat -d -k -x 5 (查看设备使用率(%util)和响应时间(await))

1)tps:该设备每秒的传输次数。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。

2)iops :硬件出厂的时候,厂家定义的一个每秒最大的IO次数

3)"一次传输"请求的大小是未知的。

4)kB_read/s:每秒从设备(drive expressed)读取的数据量;

5)KB_wrtn/s:每秒向设备(drive expressed)写入的数据量;

6)kB_read:读取的总数据量;

7)kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

4系统层面问题解决办法?

你认为到底负载高好,还是低好呢?在实际的生产中,一般认为Cpu只要不超过90%都没什么问题。

当然不排除下面这些特殊情况:

Cpu负载高,IO负载低:

1)内存不够;

2)磁盘性能差;

3)SQL问题--->去数据库层,进一步排查SQL 问题;

4)IO出问题了(磁盘到临界了、raid设计不好、raid降级、锁、在单位时间内tps过高);

5)tps过高:大量的小数据IO、大量的全表扫描。

IO负载高,Cpu负载低:

1)大量小的IO写操作:

autocommit,产生大量小IO;IO/PS,磁盘的一个定值,硬件出厂的时候,厂家定义的一个每秒最大的IO次数。

2)大量大的IO 写操作:SQL问题的几率比较大

IO和cpu负载都很高:

硬件不够了或SQL存在问题。

阅读笔记05-架构师必备最全SQL优化方案(1)的更多相关文章

  1. 阅读笔记06-架构师必备最全SQL优化方案(2)

    四.基础优化 1.优化思路? 定位问题点吮吸:硬件-->系统-->应用-->数据库-->架构(高可用.读写分离.分库分表). 处理方向:明确优化目标.性能和安全的折中.防患未然 ...

  2. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  3. Java架构师必备技能:docker使用大全

    前言   java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...

  4. 架构师必备:系统容量现状checklist

    正如飞机在起飞前,机长.副机长要过一遍checklist检查,确认没问题了才能起飞.楼主也整理了一个系统容量现状checklist,方便对照检查.本文搭配架构师必备:如何做容量预估和调优,食用更佳. ...

  5. 架构师必备:MySQL主从同步原理和应用

    日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...

  6. UML大战需求分析——阅读笔记05

    最近看过几个程序员大学后一起创业,与大公司抢项目并成功逆袭的视频,感触颇深:第一.技术是关键:第二.有一群可靠并且技术超群的队友,在关键时刻不会掉链子:第三.善于部署谨慎周密的计划:第四.一流的口才+ ...

  7. .NET架构师必备知识

    .NET架构师,我归纳一下要学的知识: 成为优秀程序员,需要学好的知识: 1. 面向对象编程.UML画图.设计模式.代码重构 2. 常用ORM工具 3.  MVC,WCF,XMl, JQuery ,S ...

  8. k8s阅读笔记2-k8s架构

    前言 阅读地址 https://rootsongjc.gitbooks.io/kubernetes-handbook/content/concepts/ 架构 架构图说明: master 指服务端 1 ...

  9. 架构师必备:Redis的几种集群方案

    结论 有以下几种Redis集群方案,先说结论: Redis cluster:应当优先考虑使用Redis cluster. codis:旧项目如果仍在使用codis,可继续使用,但也推荐迁移到Redis ...

随机推荐

  1. redis关闭和启动

    redis关闭 到redis节点目录下执行如下命令 redis-cli -p 端口号 shutdown redis启动 ./redis-server 参数 参数:redis.conf文件全路径 需要到 ...

  2. 【接口工具】mac环境下使用Charles抓包Https请求

    Charles支持针对Https包解析.具体安装导航请参考“[接口工具]接口抓包工具之Charles” 操作流程 电脑安装证书: Help-SSL Proxying-Install Charles R ...

  3. SQL在Oracle内部的具体处理流程

         下图显示了SQL在Oracle内部处理的一般阶段:解析.优化.产生行源和执行.数据库可能会忽略某些步骤,这取决于具体的语句.                                 ...

  4. NGUI的怎么在一个Gameobject(游戏物体)中调用另一个Gameobject(游戏物体)的脚本(C#)

    一,在C#代码中,我们都知道可以给游戏物体添加一个脚本,如下图 二,在当前我们是可以调用到该游戏物体脚本定义的变量,但是我们要在其他脚本调用怎么办?如下代码, KnapSackItem kn = it ...

  5. SSH学习笔记(二)

    # 1. 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 Port 22 # SSH 预设使用 22 这个 port,您也可以使用多的 port ! # 亦即 ...

  6. websocket在springboot+vue中的使用

    1.websocket在springboot中的一种实现 在java后台中,websocket是作为一种服务端配置,其配置如下 @Configuration public class WebSocke ...

  7. h5与app交互

    现在移动端 web 应用,很多时候都需要与原生 app 进行交互.沟通(运行在 webview中),比如微信的 jssdk,通过 window.wx 对象调用一些原生 app 的功能.所以,这次就来捋 ...

  8. linux 根目录扩容

    之前搭建了一个CentOS(7.0, x64)的VM,一直没留意它的硬盘空间.昨天,系统突然弹出警示,说 根目录 空间不足了. 这样的话,就只能给它增加空间呗. 我自己其实已经增加过硬盘空间了,但是为 ...

  9. css文档之盒模型阅读笔记

    前段时间抽空仔细阅读了w3c的css文档关于盒模型方面的一些基础知识.边读边记录了一些要点,在此做些整理,与大家分享,如有理解有误之处,请不吝指教. 1.综述 文档中的每个元素被描绘为矩形盒子.渲染引 ...

  10. C# List<object> 按特定字段排序

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...