在Mysql中执行Sql语句经常会遇到有的语句执行时间特别长的情况,出现了这种情况我们就需要静下心分析分析。

  首先,我们需要确定系统中哪些语句执行时间比较长。这个可以使用Mysql的慢日志来跟踪。下面给出一段SQL示例:

  首先准备一个数据库,这里有现成的数据:

  https://github.com/grezbo/cn_zipcode

  数据准备好了,我们先看下mysql中关于慢日志的系统变量(慢日志默认是没有开启的,而我这里已经开启了)

  show variables like 'slow%'

  

  如果看到slow_query_log是OFF,那就需要手动开启

  set global slow_query_log = ON;

  再看下当前将超过多少时间的sql作为慢日志

  show variables like 'long%';

  

  我这里目前是1s,可以设置:set long_query_time = 0.1;

  最后看下当前session记录的慢日志次数:

  show status like '%slow_q%';

  

  我这里当前已经执行了3次慢查询

  好啦,前期工作准备好了,接下来我们可以执行一条语句了:

  select * from zip_code order by district, area;

  

  这条语句执行了1.745s,已经达到了慢查询的标准,应该被记录下来,所以我们查看一下状态变量Slow_queries

  

  已经变成了4,说明该条语句确实被记录了下来,那么我们去看下慢查询语句所在的文件

  

  在slow_query_log_file这个路径下面

  

  可以看到这里就是我们刚才执行那条语句,可以看到真实执行的时间是1.743617。

  到这一步,我们定位了慢SQL,接下来就是对SQL语句进行分析了。有经验人看几眼SQL可能就知道问题在哪儿了,

我做不到。。。。我一般采用分段分析和用explain命令来分析。

  对刚才那条语句使用explain:

  explain select * from zip_code order by district, area;

  

  这条命令返回的特别快,因为它并不会去执行SQL语句,只是分析语法优化器最终会采用什么策略来执行SQL语句。

  这里面可以看到该条SQL有没有走索引,用的什么来排序,用了那个索引等等,具体可以参考其他博文,我就没必要再贴出来了

  https://www.cnblogs.com/yycc/p/7338894.html

  优化的原则是查询要尽量走索引,避免过多的回表和全表扫描的发生;尽量不要用*号,尽量带上where条件。

  以上是一篇很简单的关于分析慢SQL的文章,感谢各位阅读。

Mysql的Sql语句优化的更多相关文章

  1. mysql的sql语句优化方法面试题总结

    mysql的sql语句优化方法面试题总结 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结 ...

  2. php面试专题---MySQL常用SQL语句优化

    php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...

  3. MySQL常用SQL语句优化

    推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...

  4. MySQL之SQL语句优化

    语句优化 即优化器利用自身的优化器来对我们写的SQL进行优化,然后再将其放入InnoDB引擎中执行. 条件简化 移除不必要的括号 select * from x where ((a = 5)); 上面 ...

  5. MySQL 数据库--SQL语句优化

    explain查询和分析sql 开发中,为满足一业务功能,使用mysql书写sql时,一条sql往往有多种写法,那么我们就需要选择执行效率比较高的sql. 因此要比较分析sql的执行过程,且同一条sq ...

  6. 千万级大数据的Mysql数据库SQL语句优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. MySQL的SQL语句优化-group by语句的优化

    原文:http://bbs.landingbj.com/t-0-243202-1.html 默认情况下,MySQL排序所有GROUP BY col1, col2, ....,查询的方法如同在查询中指定 ...

  8. 重新学习MySQL数据库12:从实践sql语句优化开始

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...

  9. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

随机推荐

  1. Lua 5.3注册C++类相关API

    int luaL_newmetatable (lua_State *L, const char *tname); 如果注册表中不存在名为tname的表,则在注册表中创建一个名为tname的表,并将这个 ...

  2. Jmeter逻辑控制器,简单操作

    1. 2. 循环控制器可以设置请求的循环次数或永久循环, .  作用:改控制器下的取样器请求可以循环运行. 3. 请求需要拖拽到循环控制器里, 4.循环次数乘以线程数 得到如下图: 成功了 二. 事务 ...

  3. leetcode刷题-39组合总和

    题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重 ...

  4. apache常见错误:VC运行库(找不到 VCRUNTIME140.dll)

    1. 安装apache为系统服务时报错:找不到 VCRUNTIME140.dll 解决方案:安装 VC2015 2. 下载并安装 VC2015 运行库, 运行 VC_redist.x64.exe 无脑 ...

  5. .NET委托,事件和Lambda表达式

    委托 委托是什么? 委托是一种引用类型(其实就是一个类,继承MulticastDelegate特殊的类.),表示对具有特定参数列表和返回类型的方法的引用. 每个委托提供Invoke方法, BeginI ...

  6. C的文件操作---笔记

    打开文件  FILE *fp = fopen(char *filename, char *mode) 关闭文件  fclose(fp) 字符形式读  char ch = fgetc(fp) 字符形式写 ...

  7. Charles的几个用途

    1.拦截请求,篡改请求和响应 拦截请求,修改请求可以测试网站中一些异常的情况,检查服务端是否有校验的情况 检查是否存在漏洞,就看拦截之后修改过的数据是否写进了数据库 使用方法: 举例一:上传文件 1. ...

  8. python之csrf简介

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全 ...

  9. 《Java从入门到失业》第四章:类和对象(4.2):String类

    4.2String类 这一节,我们学习第一个类:String类.String翻译成汉语就是“字符串”,是字符的序列.我们知道,在Java中,默认采用Unicode字符集,因此字符串就是Unicode字 ...

  10. vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单

    一. 前言 本篇基于 有来商城 youlai-mall微服务项目,通过对vue-element-admin的权限菜单模块理解个性定制其后台接口,实现对vue-element-admin工程几乎不做改动 ...