下面我用一个例子来演示如何使用explain来优化mysql查询:

需求是这样的,在一个有1300+万条的mysql表中查出一个时间段内的数据,联表查询:select d2.name as '大区' ,d1.name as '事业部', et_station.name as '小区',et_device.direction as '方向',count(1) as '次数'

from et_exception

join et_station on et_station.id=et_exception.station

join et_device on et_device.id=et_exception.device

join et_department as d1 on d1.id=et_station.dept

join et_department as d2 on d1.parent=d2.id

where

`et_exception`.`time`>=UNIX_TIMESTAMP('2017/04/24 00:00:00')

and

`et_exception`.`time`

group by et_exception.station,et_device.direction

这条SQL语句直接执行,查询需要9秒完成,可想而知,在实际应用中,这条sql会有非常大的隐患,我们来用explain分析下:

可以看到,主表采用了全表扫描(type:ALL),mysql查询了13149541行记录(rows),这样的效率非常之低,业务需求不能更改的情况下,在生产环境执行可能会跑跨数据库,下面我们简单做处理:

考虑到业务需求,经常用时间来作为条件,查询数据导出报表,我们来给time字段加上索引。

再来explain分析下:explain(select d2.name as '大区' ,d1.name as '事业部', et_station.name as '小区',et_device.direction as '方向',count(1) as '次数'

from et_exception

join et_station on et_station.id=et_exception.station

join et_device on et_device.id=et_exception.device

join et_department as d1 on d1.id=et_station.dept

join et_department as d2 on d1.parent=d2.id

where

`et_exception`.`time`>=UNIX_TIMESTAMP('2017/04/24 00:00:00')

and

`et_exception`.`time`

group by et_exception.station,et_device.direction)

下面我们看结果:

对比上一张图我们能看到,type由ALL变成了range(范围检索),因为我们给time字段上了索引,mysql可以利用索引来检查行。rows由1300多万变成1,表示这次只用查询1行就完成了查询;

然后我们执行sql查询,整个查询只需要0.3秒完成。

当然了,这只是个例子,并不是可以适用任何业务需求的场景,explain可以帮我们分析出很多问题,大家可以去多多了解。

原创文章如转载,请注明出处,本文首发于彭超的博客

打赏

微信扫一扫,打赏作者吧~

mysql的explain的用途,利用Explain来分析和优化你的mysql相关推荐

  1. MySQL - order by 出现 using filesort根因分析及优化

    文章目录 Pre Case table 模拟数据 故障复现 咋办? 方案一 加limit ,少取一点? using filesort 到底是个什么鬼???? filesort 步骤 rowid 排序 ...

  2. mysql 多key索引_MYSQL的EXPLAIN到底多好用?

    工欲善其事必先利其器! 作为一名程序员,免不了要和MYSQL打交道.而在这过程中,就不得不面对性能优化这一大课题. 而在性能优化中,EXPLAIN就是能够帮助我们查看SQL执行计划是否优化的一个工具. ...

  3. MySql数据库explain用法示例_mysql explain的用法

    MySQL的EXPLAIN命令显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 一.通过expalin可以得到 1.表的读取顺序 2.表的读 ...

  4. mysql如何explan优化sql_《MySQL数据库》MySQL 优化SQL(explain)

    前言 如果要写出优质的SQL语句,就需要了解MySQL的存储原理.MySQL是如何分析SQL,如何利用索引查询. Explain 关键字 explain select * from ic_base;  ...

  5. mysql explain output_MySQL查询优化之explain的深入解析【转载】

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

  6. mysql range代表什么意思_MYSQL explain详解之range

    explain显示了MySQL如何使用索引来处理DML语句以及连接表,explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句 2.EXPLAIN列的解释: table:显示这一行的数据是 ...

  7. mysql中的explain_MySQL中的EXPLAIN

    使用EXPLAIN加上SELECT语句可以获取优化器的查询执行计划 MySQL会在查询上设置一个标记,当执行查询时,这个标记会返回关于在执行计划中每一步的信息,而不是执行它.它会返回一行或多行信息,一 ...

  8. mysql的explain中type取值与SQL性能优化的关系

    本文转载自[1],对[1]进行了整理 explain结果中的type字段列表: type字段取值  说明 SQL示范 扫描条件 建表特点 system 系统表,少量数据,往往不需要进行磁盘IO: ex ...

  9. mysql explain 索引_MySql中Explain详解与索引最佳实践

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...

最新文章

  1. AI换脸鉴别率超99.6%,微软用技术应对虚假信息
  2. Android Studio检测内存泄露和性能
  3. cxgrid列高度行宽度定义
  4. NSNumber 以及NSInteger,NSNumber以及Int的区别
  5. Chrome 访问一次 Controller,请求却执行两次
  6. 在安卓上,微信公众号无法分享到QQ的解决办法之一
  7. mvc框架异常处理机制
  8. 【飞秋】一起学Windows Phone7开发(十三.四 基本控件)
  9. Eclipse的Git插件Egit: merge合并冲突具体解决方法
  10. python学习:删除空白
  11. 阻塞与非阻塞 异步 与同步
  12. jQuery treeTable
  13. sangerbox平台使用(五)venn图的绘制
  14. 使android桌面图标变大
  15. Kindle支持文档类型
  16. VS2008单元测试之调用的目标发生了异常
  17. Delphi下spcomm的安装,win7系统,delphi7和delphi2010.
  18. React Native热更新方案
  19. java手机验证码代码_发送手机验证码
  20. 使用WebMagic+ActiveMQ+Quartz实现全国城镇天气自动更新的API接口开发

热门文章

  1. 回顾线程的竞争机制-轻量级锁
  2. Redis中的过期策略
  3. 通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法
  4. webpack打包js文件
  5. ES6新特性之转码器(UmiJS入门)
  6. 解决2次查询User的问题(ThreadLocal)
  7. Apollo客户端读取数据原理
  8. springBoot整合Listener
  9. Zuul使用正则表达式指定路由规则
  10. 在IDEA连接MySql数据库时报错: [08001] CLIENT_PLUGIN_AUTH is required com.mysql.cj.exceptions.