当生产数据量急剧增长后,很多SQL语句可能会开始暴露出性能问题。当面对一个有SQL性能问题的数据库时,应该从何处入手进行系统的分析,使得能够尽快定位到问题SQL处并尽快解决问题?

第一步:查看SQL执行频率

  MySQL客户端连接成功后,通过show  [session|global]  status命令可以提供服务器状态信息。show  [session|global]  status可以根据需要加上参数“session”或者“global”来显示session级(当前连接)的统计结果和global级(自数据库上次启动至今)的统计结果。如果不写,默认使用session。

  

  显示当前session所有参数的统计结果:

  

  

  显示global级的所有参数的统计结果:

  

  

  

  

 第二步:定位执行效率低的SQL语句

  可以通过以下两种方式定位执行效率低的sql语句

  1)慢查询日志:用--log-slow-querles[=file_name]选项启动时,mysql写一个包含所有执行时间超过long_query_time秒的sql语句的日志文件。

  2)show processlist:慢日志查询在查询结束后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前mysql在进行的线程,包括线程的状态,是否锁表等,可以实时地查看sql的执行情况,同时对一些锁表操作进行优化。

  

  

 第三步:explain分析执行计划

  通过以上步骤查询到效率低的sql语句后,可以通过explain或者desc命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。

  查询sql语句的执行计划:

  

  

  id:id相同表示加载表的顺序是从上到下;id不同id值越大,优先级越高,越先被执行;id有相同也有不同,id相同则从上到下顺序执行,id不同则id值越大越先被执行。

  select_type:表示select的类型,有如下的常见取值:

  

  

  table:展示这一行的数据是关于哪一张表的

   type:显示的是访问类型,是较为重要的一个指标,可取值为:

   

  

  key:

  

  rows:扫描行的数量

  extra:其他的额外的执行计划信息,在该列展示

  

 第四步:show  profile分析sql

  Mysql从5.0.37版本开始增加了对show  profiles 和show  profile语句的支持,show profiles能够在做sql优化时帮助我们了解时间都耗费到哪里去了。

  通过select  @@profiling命令查看当前mysql是否开启profile:(1表示已经开启,可以通过set  profiling=1命令开启,set  profiling=0关闭)

  

  随便执行几条sql语句:

  

  再通过show profiles命令查看sql语句执行的耗时:

  

  通过show  profile for query query_id命令查看某条sql在执行过程中每个线程的状态和消耗的时间

  

  注意:Sending  data 状态便是mysql线程开始访问数据行并把结果返回给客户端,而不仅仅是返回给客户端,由于在Sending  data状态下,mysql线程往往要坐大量的磁盘读取操作,所以经常是整个查询中耗时最长的状态。

  在获取到最消耗时间的线程状态之后,mysql支持进一步选择all、cpu、block lo、context switch、page faults等明细类型查看mysql在使用什么资源上耗费了过高的时间,例如,选择查看cpu的耗费时间:

  

 第五步:trace分析优化器执行计划

  mysql5.6提供了对sql的跟踪trace,通过trace文件能够进一步了解为什么优化器选择A计划而不是选择B计划

  打开trace。设置格式为json并设置trace最大能够使用的内存大熊啊,避免解析过程因为内存过小而不能够完整展示。

  

  在执行完sql语句后,检查 information_schema.optimizer_trace就可以知道mysql是如何执行sql的。

  

SQL优化步骤的更多相关文章

  1. 复杂sql优化步骤与技巧

    数据管理型系统,由于用户的要求或者系统设计要求,会出现大量表进行join,还要进行大量统计性数据查询展示,甚至数据权限控制等操作.最后会导致sql异常复杂,随着数据量增加,或者只是应用到生产环境(正式 ...

  2. 温故知新-Mysql的体系结构概览&sql优化步骤

    文章目录 Mysql的体系结构概览 连接层 服务层 引擎层 存储层 存储引擎 存储引擎概述 存储引擎特性![存储引擎特性对比](https://img-blog.csdnimg.cn/20200510 ...

  3. MS Sql 优化步骤及优化not in一例

    今天接到客户投诉说系统卡死了,经过一翻努力,终于解决了.现将解决步骤记录一下,以便下次参考: 因为客户系统集中在阿里云上面,使用的是ms sql2008数据库,上面有N个客户,一下子无法知道是哪个客户 ...

  4. MySQL架构优化实战系列4:SQL优化步骤与常用管理命令

  5. 梁敬彬老师的《收获,不止SQL优化》,关于如何缩短SQL调优时间,给出了三个步骤,

    梁敬彬老师的<收获,不止SQL优化>,关于如何缩短SQL调优时间,给出了三个步骤, 1. 先获取有助调优的数据库整体信息 2. 快速获取SQL运行台前信息 3. 快速获取SQL关联幕后信息 ...

  6. MySql(五)SQL优化-优化SQL语句的一般步骤

    MySql(五)SQL优化-优化SQL语句的一般步骤 一.优化SQL语句的一般步骤 1.1 通过show status命令了解各种SQL的执行频率 1.2 定位执行效率较低的SQL语句 1.3 通过e ...

  7. mysql索引sql优化方法、步骤和经验

    MySQL索引原理及慢查询优化 http://blog.jobbole.com/86594/ 细说mysql索引 https://www.cnblogs.com/chenshishuo/p/50300 ...

  8. MySQL系列(七)--SQL优化的步骤

    前面讲了如何设计数据库表结构.存储引擎.索引优化等内存,这篇文章会讲述如何进行SQL优化,也是面试中关于数据库肯定会被问到的, 这些内容不仅仅是为了面试,更重要的是付诸实践,最终用到工作当中 之前的M ...

  9. SQL优化案例—— RowNumber分页

    将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...

随机推荐

  1. mysql 之full join

    首先,mysql中是不支持full join的,如果要实现类似的功能可以用union all,union会剔除重复.以下是实现实例 create table if not exists t1(`id` ...

  2. Vue脚手架(CLI)第一天

    vue 1.脚手架的搭建(CLI) 1.1.下载nodejs,在官网, [nodejs官网地址][ https://nodejs.org/en/ ] 无脑下一步就可以了.环境自动安装 1.2.下载脚手 ...

  3. 利用图像二维熵实现视频信号丢失检测(Signal Loss Detection)

    1 图像二维熵 图像二维熵作为一种特征评价尺度能够反映出整个图像所含平均信息量的高低,熵值(H)越大则代表图像所包含的信息越多,反之熵值(H)越小,则图像包含的信息越少.对于图像信息量,可以简单地认为 ...

  4. Dubbo源码(七) - 集群

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 集群(cluster)就是一组计算机,它们作为一个总体向用户提供一组网络资源.这些单个的计算机系 ...

  5. 在使用amoeba连接数据库时,报错java.lang.Exception: poolName=slaves, no valid pools

    项目场景:Mysql 实现数据库读写分离 搭建3台MySQL服务器,完成主从复制,搭建一台amoeba服务器,完成MySQL的读写分离 问题描述: 问题1. 在服务搭建完毕后,利用客户机连接amoeb ...

  6. 高并发之网络IO模型

    你好,我是坤哥 今天我们聊一下高并发下的网络 IO 模型 高并发即我们所说的 C10K(一个 server 服务 1w 个 client),C10M,写出高并发的程序相信是每个后端程序员的追求,高并发 ...

  7. 使用 Less 混合(Mixins)时报语法错误

    今天在尝试使用 less 的混合语法时,浏览器直接报了一个语法错误.下图是报错信息: 仔细地阅读了官方文档,和对比自己写的,并没有任何错误. .FlexLayout { .Start() { disp ...

  8. linux之间上传下载--SCP

    1.远程拷贝文件 [root@rhel8-client01 yum.repos.d]# scp root@192.168.72.149:/etc/yum.repos.d/* . (.表示拷贝到当前文件 ...

  9. Html5新增内容标签

    <canvas>画布</canvas> <audio src=""></audio> <video src="&qu ...

  10. dotnet 设计规范 · 抽象类

    X 不要定义 public 或 protected internal 访问的构造函数.默认 C# 语言不提供抽象类的公开构造函数方法. 如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时 ...