2017-10-04 86 views
0

我试图找到最好的方法来分解一长串点击,进入相关的各种登陆器相关表。优化嵌套语句

SELECT LANDER, COUNT(DISTINCT IP) AS CLICKS 
FROM 
(
    SELECT LANDER, USER_GROUP, IP 
    FROM 
    (
      SELECT LANDER USER_GROUP, IP, TIME FROM CLICKS_IN WHERE USER_GROUP = " . $_SESSION["KKGR"] . " 
    )a 
    WHERE TIME BETWEEN '" . date_format($sdate, 'Y/m/d') . "' AND '" . date_format($edate, 'Y/m/d') . "' 
)a 
GROUP BY LANDER HAVING COUNT(*)>5 ORDER BY CLICKS DESC"; 

是我到目前为止得出的唯一点击有效清单。我的两个问题是,如果可能,我宁愿编写一个准备好的查询,但我不知道如何使用嵌套的SQL语句来完成它,其次我不确定是否有更好的方法来执行此操作\有什么问题可能会导致长期运行。它运行得比一个简单的SQL语句更有效,但是我担心我可能会缓冲大部分表到RAM中,如果这种扩展。

+0

优化:使用解释计划,永远是第一个去的地方。如果需要帮助解释它,请将输出(作为文本)添加到您的问题中。最慢的常见问题是缺少索引 –

回答

0

我不认为任何嵌套是必要的,它可能会干扰MySQL在TIME列上使用索引的能力。

SELECT LANDER, COUNT(DISTINCT IP) AS CLICKS 
FROM CLICKS_IN 
WHERE USER_GROUP = " $_SESSION['KKGR'] . " 
AND TIME BETWEEN '" . date_format($sdate, 'Y/m/d') . "' AND '" . date_format($edate, 'Y/m/d') . "' 
GROUP BY LANDER 
HAVING CLICKS > 5 
ORDER BY CLICKS DESC 
+0

它的运行速度比标准查询快。我已经尝试过没有嵌套,并从测试和生活角度来看,它显着更高效。 嵌套查询大量减少了搜索大型表的操作数。 编辑:刚刚测试过您的查询,并且嵌套版本显着更好。 –

+0

需要'INDEX(user_group,time)'_in order_。 –