2017-10-04 5 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"; 

고유 한 클릭 목록을 효율적으로 얻으려고 나는 무엇을 생각해 냈습니다. 내 2 문제는 가능한 경우 준비된 쿼리를 작성하는 것이 좋겠지 만 중첩 된 SQL 문으로 수행하는 방법을 알지 못하고 두 번째로이 문제를 해결할 수있는 더 좋은 방법이 있는지 잘 모르겠습니다. 장기적으로 발생할 수 있습니다. 그것은 단순한 SQL 문보다 훨씬 더 효율적으로 실행되고 있지만이 비늘이 있다면 RAM에 한 번 테이블의 많은 부분을 버퍼링 할 수 있다는 우려가 있습니다.

+0

: 최적화 계획 : 사용 계획은 항상 첫 번째 계획입니다. 해석에 도움이 필요하면 질문에 결과를 텍스트로 추가하십시오. 느린 경우 가장 일반적인 문제는 색인이 누락되었습니다. –

답변

0

중첩이 필요하지 않으며, TIME 열의 인덱스를 사용하는 MySQL의 기능을 방해 할 수 있습니다.

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

해당 order_에'INDEX (user_group, time)'이 필요합니다. –