美文网首页
一次子查询的优化实例

一次子查询的优化实例

作者: 有财君 | 来源:发表于2019-05-26 21:01 被阅读0次

现象

有这么一张表:

create table test
(
     nodeId int,
     flowId int,
     other varchar(10),
     primary key (nodeid),
     key idx1 (flowId, nodeId)
)

现在执行这样一个SQL:

select nodeId, flowId from test 
where nodeId in (
select max(nodeId)
  from test
 where flowId in (...) group by flowId
)

这个SQL看起来就很难看,而且不易理解。这个表的记录大概是100万条,这个SQL执行时间超过600ms。

优化

优化的第一步就是看执行计划:

image.pngimage.png

挺可怕的一个执行计划,id=1的表,即外层表竟然进行一次索引全扫描,这个等同于全表扫描了。

在这里我要说一句话,这句话在大部分条件下是成立的:

关系型数据库,怕的不是关联

那么我们改造一下这个SQL,将它改成一个关联的写法:

select a.flowId, a.nodeId
 from test a
 inner join 
 (select max(nodeId) from test where flowId in (...) group by flowId) b
 on a.nodeId = b.nodeId;

这个执行计划就变成了这样:

image.pngimage.png

注意扫描行数,不过102行,而且type的类型也是很优秀的,至于效果,这是优化前:

image.pngimage.png

这是优化后:

image.pngimage.png

高下立判。

结语

其实子查询是一种自然的想法的具体实现,在非DBA写的SQL中很常见,因为逻辑上是无懈可击的。但是DBA至少应该具有集合计算的基本素质,在考虑数据库关联查询的时候首先要想到集合运算,然后是关系代数理论。

DBA确实不是一个简单的工作,数学也不能差。

相关文章

  • 一次子查询的优化实例

    现象 有这么一张表: 现在执行这样一个SQL: 这个SQL看起来就很难看,而且不易理解。这个表的记录大概是100万...

  • 第7章 SQL查询优化

    SQL 查询优化 通过慢查询 慢查询分析工具 命令的使用 实例 分析满查询日志并且记录到文件中 实时发现有问题的s...

  • Mysql查询索引优化实例

    单表240W+数据,原本的索引没有一个是对的,数据表后来被重构了。sql是这样的:SELECT sum(`real...

  • Day2:MySQL慢查询基础-查询慢原因

    说在前面: 查询优化、索引优化、库表结构优化是查询性能优化的三驾马车。 完成一个完整的查询生命周期,查询需要在...

  • MySQL性能调优

    MYSQL查询语句优化 mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬...

  • mysql优化

    MYSQL优化 为查询缓存优化你的查询 EXPLAIN你的SELECT查询。根据结果给出分析相应的查询优化 当只要...

  • MySQL(五)|《千万级大数据查询优化》第二篇:查询性能优化(

    MySQL优化一般是需要索引优化、查询优化、库表结构优化三驾马车齐头并进。本章节开始讲查询优化。 一、为什么查询速...

  • 《高性能Mysql》-查询优化

    优化性能需要查询优化、索引优化、库表结构优化这三辆马车齐头并进。这篇文章主要围绕查询优化,要对查询进行优化首先需要...

  • activiti 流程实例的查询

    创建一个流程实例查询对象,用来查询一个或多个流程实例. 第一:根据流程定义的key来查询(流程实例)的对象 第二:...

  • PostgreSQL 源码解读(29)- 查询语句#14(查询优

    本节简单介绍了PG查询逻辑优化中的子查询(subQuery)上拉优化,包括查询优化中子查询的基本概念,同时介绍了主...

网友评论

      本文标题:一次子查询的优化实例

      本文链接:https://www.haomeiwen.com/subject/hnoftctx.html