SQL优化步骤
当生产数据量急剧增长后,很多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优化步骤的更多相关文章
- 复杂sql优化步骤与技巧
数据管理型系统,由于用户的要求或者系统设计要求,会出现大量表进行join,还要进行大量统计性数据查询展示,甚至数据权限控制等操作.最后会导致sql异常复杂,随着数据量增加,或者只是应用到生产环境(正式 ...
- 温故知新-Mysql的体系结构概览&sql优化步骤
文章目录 Mysql的体系结构概览 连接层 服务层 引擎层 存储层 存储引擎 存储引擎概述 存储引擎特性SQL优化-优化SQL语句的一般步骤
MySql(五)SQL优化-优化SQL语句的一般步骤 一.优化SQL语句的一般步骤 1.1 通过show status命令了解各种SQL的执行频率 1.2 定位执行效率较低的SQL语句 1.3 通过e ...
- mysql索引sql优化方法、步骤和经验
MySQL索引原理及慢查询优化 http://blog.jobbole.com/86594/ 细说mysql索引 https://www.cnblogs.com/chenshishuo/p/50300 ...
- MySQL系列(七)--SQL优化的步骤
前面讲了如何设计数据库表结构.存储引擎.索引优化等内存,这篇文章会讲述如何进行SQL优化,也是面试中关于数据库肯定会被问到的, 这些内容不仅仅是为了面试,更重要的是付诸实践,最终用到工作当中 之前的M ...
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
随机推荐
- WPF 截图控件之画笔(八)「仿微信」
前言 接着上周写的截图控件继续更新添加 画笔. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...
- GTID主从和lamp架构运行原理
目录 GTID主从 GTID概念介绍 GTID工作原理 GTID主从配置 lamp lamp简介 web服务器工作流程 cgi与fastcgi http协议 是什么? lamp架构运行的原理 Apac ...
- 清理忽略springboot控制台启动的banner和启动日志
清理忽略springboot控制台启动的banner和启动日志 1.springboot的banner spring: main: banner-mode: off 2.mybatis-plus的ba ...
- thinkphp 5 及一下或php项目里实现模糊查询
想在thinkPHP或者PHP项目实现模糊查询怎么实现呢? 今天在网上搜了一下用 mysql里的 like 就可以实现 怎么用呢? 看代码: 错误用法: where('title','like',$s ...
- STC8H开发(十六): GPIO驱动XL2400无线模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- 以太坊 layer2: optimism 源码学习(二) 提现原理
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...
- ubuntu 连不上网怎么办?
[简洁版本] ctrl+alt+delete -> 任务管理器 ->"服务"选项卡 -> 运行"VMnet""VMware" ...
- 未完待续【java】JavaEE学习路线总览
这个博客会详细介绍各种技术的知识点,从零基础到入门,充当引路的作用. 同时也会发布一些Swift语言.c#语言.Xcode开发的学习笔记.一些阅读的笔记(部分读书笔记无法发布). 目前1-43的Jav ...
- flutter系列之:移动端的手势基础GestureDetector
目录 简介 Pointers和Listener GestureDetector 手势冲突 总结 简介 移动的和PC端有什么不同呢?同样的H5可以运行在APP端,也可以运行在PC端.两者最大的区别就是移 ...
- 第十篇:vue.js for循环语句(大作业进行时)
Vue.js 循环语句 <div id="app"> <ol> <li v-for="site in sites"> /*f ...