【发布时间】:2020-03-08 00:42:28
【问题描述】:
我的查询有性能问题,我找到了解决方案,但我真的不明白为什么我有问题,所以有人可以解释一下... 我有 2 个表:流(几百万行)和设备(
我的第一个问题是:
SELECT * FROM Flow WHERE FlowId IN (SELECT MAX(FlowId) FROM Flow GROUP BY DeviceId)
执行时间 > 200 秒。
如果我先执行子查询(我在 0.01 秒内得到结果),然后在查询中使用结果:
SELECT * FROM Flow WHERE FlowId IN (93143922, 93143921)
我的结果不到一秒钟... DBMS 如何执行第一个查询?我认为流程是: 首先执行子查询,然后在“主”查询中使用结果?如果我手动执行此步骤,查询速度很快,所以这绝对不是它的工作方式:(
我的解决办法是这样的:
SELECT * FROM Flow f
INNER JOIN Devices d on d.DevicesId = f.DeviceId
INNER JOIN (SELECT MAX(FlowId) as FlowId FROM FLOW GROUP BY DeviceId) maxFlow
ON maxFlow.FlowId = f.FlowId
但我需要知道它是如何与 IN 一起工作的 :)
【问题讨论】:
-
怎么知道哪个设备属于哪个流?
-
从每个查询的 EXPLAIN 开始
标签: mysql sql performance subquery