MySQL SQL优化的正确姿势

大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

已经很久没写文章了 今天分享一篇优化SQL 案例

slow query 里有如下 SQL

看下执行计划如下 

从执行计划可以看出C表全表扫描了  

那我们看具体的SQL  

从具体SQL 中可以看出 where 条件里能达到好的过滤条件的 应该是 

B表 ,那先看下B表相关条件有没有索引 

从上图所示,我们知道了 是有索引的,那应该案例来说,B表应该当驱动表,但实际没有 ,而是C表当了驱动表 为啥呢 ?

我们都知道MySQL 是基于COST 的优化器  如果 B 当驱动表的话 那连接顺序应该是 B->A->C 显然在这个过程中哪个地方的COST 太高了 所以最终没选择这个执行计划。

我们重点看下 A->C 的连接条件

我们看下 这个连接条件所对应的C表的索引情况 

从这可以看到 **C表 对应的连接条件 在索引里不是前导列,也就是第一个列
**

所以问题就出现在这里了 。

那到此,我们先测试下,单独创建一个单列索引 

然后看下执行计划 

嗯 达到了我们的预期效果。看下具体执行效果

我的新一轮的SQL 优化课 即将在春节后开课 

我是知数堂SQL 优化班老师~ ^^

如有关于SQL优化方面疑问和一起交流的请加 并且 @兔子@知数堂SQL优化

高性能MySQL,SQL优化群 有叶金荣,吴炳锡 两位大神坐镇 :579036588

欢迎加入 知数堂大家庭。

我的微信公众号:SQL开发与优化(sqlturning)

本文分享自微信公众号 - 老叶茶馆(iMySQL_WX)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )