我有以下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进行改进。
也就是说,对未来的工作来说,注意任何指数的改进仍然是有益的。
5条答案
按热度按时间gdx19jrr1#
除了显示所有相关表的createtable语句外,有关查询性能的问题始终是对给定查询的解释。
也就是说,在我们等待必要的信息出现时,根据我的经验,不相关的子查询有时会优于相关的子查询,因此我会尝试这样编写查询:
dhxwm5r42#
您的查询很好——尽管您应该使用所有列的限定列名来编写它:
你需要索引
messageinfo(flowid, traceid)
. 索引flow(name, flowid)
可能也有帮助。iyzzxitl3#
可以使用sql索引快速检索数据。你看不到索引,它们只是用来加速搜索/查询。下面是添加索引的语法。
ruarlubt4#
为什么不使用messageinfo中的窗口函数max(traceid)over(partitionbytraceid orderbytraceid)
?
uqjltbpv5#
使用join重写查询的另一种方法是,将从属子查询部分移动到sub子句,并将其与主查询连接起来。
同时在(flowid,traceid)上添加复合索引