sql内部连接-性能改进

pgpifvop  于 2021-06-21  发布在  Mysql
关注(0)|答案(5)|浏览(268)

我有以下sql,但希望提高性能(下面的选项2目前需要大约24秒)。
解释mysql-使用下面答案中的示例

选项1-基本选择(非常慢)

select f.name, f.flowid, m.traceid, m.traceday, m.logtimestamp
from flow f, messageinfo m 
where traceid = (select max(traceid) from messageinfo where flowid = f.flowid)

更新
选项2-使用内部连接(更快但仍然太慢)

select m.traceid, f.name, f.flowid, m.traceday, m.logtimestamp
from flow f
  inner join messageinfo m 
  on m.flowid = f.flowid
  where traceid = (select max(traceid) from messageinfo where flowid = 
  f.flowid)
order by f.name

我需要循环浏览流记录(大约有900个),并为每个流选择messageinfo表中最新的相关流,即具有该特定流的最高traceid。上面的两个sql示例都可以工作,但是如果可能的话,我想看看是否可以提高选项2的性能。最终结果应该是尽力而为的,并且只返回一个traceid,其中可以找到相关的流记录(如内部连接)。有人能提出一个更有效的方法吗?请记住,我希望在最终结果中返回两个表中的数据(如上面的示例所示)。
我还需要强调的是,我没有用新的/更新的索引修改数据库的自由。因此,主要是在不修改数据库的情况下对sql进行改进。
也就是说,对未来的工作来说,注意任何指数的改进仍然是有益的。

gdx19jrr

gdx19jrr1#

除了显示所有相关表的createtable语句外,有关查询性能的问题始终是对给定查询的解释。
也就是说,在我们等待必要的信息出现时,根据我的经验,不相关的子查询有时会优于相关的子查询,因此我会尝试这样编写查询:

select m.traceid
     , f.name
     , f.flowid
     , m.traceday
     , m.logtimestamp
  from flow f
  join messageinfo m 
    on m.flowid = f.flowid
  Join
     ( select flowid
            , max(traceid) traceid 
         from messageinfo 
        Group
           By flowid
     ) x
    On x.flowid = f.flowid
   And x.traceid = m.traceid
 order 
    by f.name
dhxwm5r4

dhxwm5r42#

您的查询很好——尽管您应该使用所有列的限定列名来编写它:

select m.traceid, f.name, f.flowid, m.traceday, m.logtimestamp
from flow f inner join
     messageinfo m 
     on m.flowid = f.flowid
where m.traceid = (select max(m2.traceid) from messageinfo m2 where m2.flowid = m.flowid)
order by f.name;

你需要索引 messageinfo(flowid, traceid) . 索引 flow(name, flowid) 可能也有帮助。

iyzzxitl

iyzzxitl3#

可以使用sql索引快速检索数据。你看不到索引,它们只是用来加速搜索/查询。下面是添加索引的语法。

CREATE INDEX index_name
ON table_name (column1, column2, ...);
ruarlubt

ruarlubt4#

为什么不使用messageinfo中的窗口函数max(traceid)over(partitionbytraceid orderbytraceid)
?

uqjltbpv

uqjltbpv5#

使用join重写查询的另一种方法是,将从属子查询部分移动到sub子句,并将其与主查询连接起来。

select m.traceid, f.name, f.flowid, m.traceday, m.logtimestamp
from flow f
inner join messageinfo m on m.flowid = f.flowid
inner join (
    select flowid, max(traceid) traceid
    from messageinfo 
    group by flowid
) m1 on  m.flowid = m1.flowid and m.traceid = m1.traceid
order by f.name

同时在(flowid,traceid)上添加复合索引

相关问题