当生产数据量急剧增长后,很多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. linux学习之selinux安全处理

    linux在默认情况下会开启selinux,如果软件开放的端口不是selinux默认的协议端口会导致防火墙端口开放后还是无法访问.以下是解决办法. [root@localhost ~]# semana ...

  2. Vue 事件的基本使用 && 事件修饰符

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...

  3. [spring]spring详细总结

    spring 1.spring简介 Spring框架是一个开源的应用程序框架,是针对bean的生命周期进行管理的轻量级容器. Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强 ...

  4. Hive存储格式之RCFile详解,RCFile的过去现在和未来

    我在整理Hive的存储格式和压缩格式,本来打算一篇发出来,结果其中一小节就有很多内容,于是打算写成Hive存储格式和压缩格式系列. 本节主要讲一下Hive存储格式最早的典型的列式存储格式RCFile. ...

  5. RocketMQ保姆级教程

    大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...

  6. 刷题记录:Codeforces Round #724 (Div. 2)

    Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...

  7. [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)

    (2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...

  8. OID天下第一 (双指针,LCT,线段树)

    题面 或曰:"笑长天下第一!",OID 喜得合不拢嘴:"哈哈哈哈哈哈--" OneInDark 是天下第一的. OneInDark 给了你一个 n n n 个点 ...

  9. HTML初学者小知识2

    网页内嵌 代码以及演示如下 代码 <div id="tab_1"> <iframe src="div.html" height="5 ...

  10. 1.3_HTML基础知识

    打开记事本,输入 <html> <hand> <title>我要自学网</title> </hand> <body> <h ...