这个查询的select语句有什么问题?

时间:2014-04-08 18:22:41

标签: mysql

此查询生成预期结果:

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但同样的东西。问题是什么?

2 个答案:

答案 0 :(得分:0)

如果这些查询完全相同(相当多),但是一个查询需要永远而另一个查询完全没有,那么添加外部选择很可能会混淆数据库的查询优化器。我建议你看一下解释计划'对于这两个查询 - 如果它们有很大的不同,那么你就得到了答案,而你需要解决(不确定mysql是否有提示')如何让解释计划回到正轨。如果没有,我恐怕我没有想法; - )

https://www.google.co.uk/search?q=mysql+show+select+plan&oq=mysql+show+select+plan&aqs=chrome.0.57.7245&sourceid=chrome&ie=UTF-8#q=mysql+explain+plan

答案 1 :(得分:0)

我可以在您的查询中看到几个星期,但我无法通过移动来说明结果会是什么。

  1. 您是否知道您的SGBD有很多算法根据查询结构预先计算结果?如果嵌套SELECT,它将不会给出相同的搜索路径。删除1列的额外选择可能会改变MySQL的搜索路径。

  2. 由于我们处于搜索路径的主题中,因此某些SGBD允许您保存搜索路径并根据您重复使用最优化的搜索路径,因此请注意这一点。

  3. 在您的情况下,真正耗时的是第一个FROM语句中的强制连接。

    这     as_path a,     as_path b,     update_detail c

  4. 这通常导致加入所有这些表的非常耗时的算法。

    尽可能使用INNER JOIN关键字来简化搜索路径引擎的工作。

    1. 另一个耗时的算法是IN关键词。每当有机会试图避免IN并用JOIN结构替换它。

    2. 如果仍有问题,请将嵌套SELECT替换为临时表。