阅读笔记05-架构师必备最全SQL优化方案(1)
一、优化的哲学
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)的更多相关文章
- 阅读笔记06-架构师必备最全SQL优化方案(2)
四.基础优化 1.优化思路? 定位问题点吮吸:硬件-->系统-->应用-->数据库-->架构(高可用.读写分离.分库分表). 处理方向:明确优化目标.性能和安全的折中.防患未然 ...
- 《uml大战需求分析》阅读笔记05
<uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...
- Java架构师必备技能:docker使用大全
前言 java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...
- 架构师必备:系统容量现状checklist
正如飞机在起飞前,机长.副机长要过一遍checklist检查,确认没问题了才能起飞.楼主也整理了一个系统容量现状checklist,方便对照检查.本文搭配架构师必备:如何做容量预估和调优,食用更佳. ...
- 架构师必备:MySQL主从同步原理和应用
日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...
- UML大战需求分析——阅读笔记05
最近看过几个程序员大学后一起创业,与大公司抢项目并成功逆袭的视频,感触颇深:第一.技术是关键:第二.有一群可靠并且技术超群的队友,在关键时刻不会掉链子:第三.善于部署谨慎周密的计划:第四.一流的口才+ ...
- .NET架构师必备知识
.NET架构师,我归纳一下要学的知识: 成为优秀程序员,需要学好的知识: 1. 面向对象编程.UML画图.设计模式.代码重构 2. 常用ORM工具 3. MVC,WCF,XMl, JQuery ,S ...
- k8s阅读笔记2-k8s架构
前言 阅读地址 https://rootsongjc.gitbooks.io/kubernetes-handbook/content/concepts/ 架构 架构图说明: master 指服务端 1 ...
- 架构师必备:Redis的几种集群方案
结论 有以下几种Redis集群方案,先说结论: Redis cluster:应当优先考虑使用Redis cluster. codis:旧项目如果仍在使用codis,可继续使用,但也推荐迁移到Redis ...
随机推荐
- Codeforces 601B(贪心+斜率+组合数学+单调栈)
题面 传送门 题目大意: L(h)的值是区间[L,R]内,abs(h[i]-h[j])/(i-j)的最大值.现在有q个询问,每个询问表示询问区间[L,R]内,所有子序列的L(h)的值的和 分析 将|h ...
- ubantu 安装mongodb数据库
STEP 1: 在终端输入GPK码 $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334B ...
- jsp页面随页面初始化加载js函数
1 <%@ page language="java" import="java.util.*" pageEncoding="gbk"% ...
- [小试牛刀]部署在IDEA的JFinal 3.0 demo
进入JFinal 极速开发市区:http://www.jfinal.com/ 如上图,点击右边的最新下载:JFinal 3.0 demo - 此过程跳过注册\登录过程, 进入到如下,下载 下载并解压到 ...
- Solr的学习使用之(十)数据库(Oracle、SqlServer)原有的全文索引功能和Solr对比?
本人有个问题一直不解,既然solr的全文索引功能这么强大,而且效果也不错,那为什么那些数据库厂商比如Oracle.SqlServer,不把solr的功能集成进去呢,或者说把全文索引的功能做好点,做到和 ...
- tomcat日志切割脚本shell
tomcat-rotate.sh: #!/bin/bash log_path="/home/tomcat7-api/logs/"expried_time=7 function de ...
- python内存分析
安装 首先安装memory_profiler和psutil pip install memory_profiler pip install psutil 在需要分析的函数前面添加装饰器@profile ...
- 【改】utf-8 的去掉BOM的方法
最近在测试中发现,linux系统中导出的文件,有记事本打开另存为或者保存后,再次导入进linux系统,发现失败了,对比文件内容,没发现区别,打开二进制文件对比发现,文件头部多了三个字符:EF BB B ...
- 【LGR-062】洛谷10月月赛 III div.2 (A-C)
前言 100+100+46+0=246pts 300多名 以后每次比赛都要有进步哦!qwq 小D与笔试 水题 Code #include<algorithm> #include<io ...
- jinfo 干涉java runtime的jvm参数
https://blog.csdn.net/bolg_hero/article/details/78156311 jinfo使用介绍可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时, ...