当生产数据量急剧增长后,很多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. java-注释、API之字符串(String)

    /** * 文档注释只定义在三个地方 : 类.常量.方法上 * 在类上定义文档注释用来说这个类设计及其解决问题等相关描述信息 * @author 作者 * @version  1.0 21/08/17 ...

  2. HEXO-admin安装和使用(汉化版)

    hi,大家好,我是KINGWDY,众所周知我用的是hexo,写博文首先要在终端输入hexo n xxxxx,然后打开MWeb PRO开始写md,但是,这很麻烦,就在我一筹莫展之际,我看到了这篇博文-- ...

  3. 【SwiftUI】学习笔记1-创建第一个iOS应用

    本系列将会开发大量实际的项目. 系列为本人学习笔记,资料:<SwiftUI自学成长笔记>-刘铭 资源源代码下载资源:可以在gitee上下载,搜索刘铭即可. 第一章:创建项目 也可以在菜单栏 ...

  4. Spring 16: SM(Spring + MyBatis) 注解式事务 与 声明式事务

    Spring事务处理方式 方式1:注解式事务 使用@Transactional注解完成事务控制,此注解可添加到类上,则对类中所有方法执行事务的设定,注解添加到方法上,则对该方法执行事务处理 @Tran ...

  5. Python自学教程12-类和对象怎么用

    Python是一门现代化的编程语言,也是一门面向对象的编程语言. 现代编程语言几乎都支持面向对象编程,面向对象编程是最有效的软件编写方法之一.你可以用类和对象来表示现实当中的任何的事物和行为. 编写类 ...

  6. Linux之搭建FTP服务

    引用:FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Proto ...

  7. Android平台Camera2数据如何对接RTMP推流到服务器

    1. Camera2架构 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用 ...

  8. KingbaseES 开启事务提交跟踪

    KingbaseESV8R6有个参数 track_commit_timestamp,用来开启跟踪事务提交的时间戳. 配置 编辑kingbase.conf,添加配置如下: track_commit_ti ...

  9. 硬核解析MySQL的MVCC实现原理,面试官看了都直呼内行

    1. 什么是MVCC MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数据的多个版本,减少读写操作的冲突. 如果没 ...

  10. Web 开发相关概念

    Web 开发相关概念 前端 后端 全栈 前端 Front-end:网站中用户看到的部分 HTML CSS JavaScript 库和框架 设计工具 后端 Back-end:网站中用户看不到的部分 编程 ...