此查询生成预期结果:
SELECT DISTINCT
a.AS_No SOURCE, b.AS_No TARGET, DATE(c.Time) as Time
FROM
as_path a,
as_path b,
update_detail c
WHERE
a.Update_ID = b.Update_ID
AND a.Path_Index = b.Path_Index - 1
AND a.Update_ID IN (
SELECT Update_ID FROM (
SELECT * FROM bgpstorage.announce_update t1
JOIN (
SELECT IP as i, MAX(Update_ID) as maxupdate
FROM bgpstorage.announce_update
GROUP BY IP) x
ON t1.IP = x.i
AND t1.Update_ID = x.maxupdate)
sub)
AND DATE(c.`Time`) BETWEEN '2013-09-02' AND '2013-09-19';
但是,我不希望Time列位于生成的表中,所以我做了类似的事情:
SELECT SOURCE, TARGET FROM (SELECT DISTINCT
a.AS_No SOURCE, b.AS_No TARGET, Date(c.Time) as Time
FROM
as_path a,
as_path b,
update_detail c
WHERE
a.Update_ID = b.Update_ID
AND a.Path_Index = b.Path_Index - 1
AND a.Update_ID IN (
SELECT Update_ID FROM (
SELECT * FROM bgpstorage.announce_update t1
JOIN (
SELECT IP as i, MAX(Update_ID) as maxupdate
FROM bgpstorage.announce_update
GROUP BY IP) x
ON t1.IP = x.i
AND t1.Update_ID = x.maxupdate)
sub)
AND DATE(c.`Time`) BETWEEN '2013-09-02' AND '2013-09-19')tbl;
但是这个查询永远运行!!!
我也试图从Select中删除Time但同样的东西。问题是什么?
答案 0 :(得分:0)
如果这些查询完全相同(相当多),但是一个查询需要永远而另一个查询完全没有,那么添加外部选择很可能会混淆数据库的查询优化器。我建议你看一下解释计划'对于这两个查询 - 如果它们有很大的不同,那么你就得到了答案,而你需要解决(不确定mysql是否有提示')如何让解释计划回到正轨。如果没有,我恐怕我没有想法; - )
答案 1 :(得分:0)
我可以在您的查询中看到几个星期,但我无法通过移动来说明结果会是什么。
您是否知道您的SGBD有很多算法根据查询结构预先计算结果?如果嵌套SELECT,它将不会给出相同的搜索路径。删除1列的额外选择可能会改变MySQL的搜索路径。
由于我们处于搜索路径的主题中,因此某些SGBD允许您保存搜索路径并根据您重复使用最优化的搜索路径,因此请注意这一点。
在您的情况下,真正耗时的是第一个FROM语句中的强制连接。
这 as_path a, as_path b, update_detail c
这通常导致加入所有这些表的非常耗时的算法。
尽可能使用INNER JOIN关键字来简化搜索路径引擎的工作。
另一个耗时的算法是IN关键词。每当有机会试图避免IN并用JOIN结构替换它。
如果仍有问题,请将嵌套SELECT替换为临时表。