mysql select performance 0 11 1,573

by r-1y [SQL Query] inline query sub query join select [2019.04.05 12:18:27]


안녕하세요. 쿼리 사용 할 일이 없다가 최근에 쿼리를 다시 쓰는데 

내부테이블에서 처리 하는 부분을 서브 쿼리로 작성하고 있었는데 언뜻 조인이 더 좋다 라는 소리가 생각나기도 하고 디비 튜닝이나 최적화 부분 관련 글을 안본지 너무 오래되서 생각이 안나네요.. 

 

왜 서브쿼리를 조인으로 바꾸라는 말이 있을까요 이 부분이 해당 되는 경우는 어떤 경우인가요?

 

지금 제가 테스트 해본 쿼리는 두개입니다. 

 

서브 쿼리 15000개 기준 0.03

select count(sub.current_date) as current_date,sub.user_id
from(
select Date(current_date) as current_date, user_id
         from day_log
         group by current_date,user_id
)as sub group by sub.user_id,sub.current_date;

 

 

조인 쿼리 15000개 기준 0.9

select count(sub.date_current_date) as current_date,sub.user_idfrom day_log as tinner join (
    select Date(current_date) as date_current_date, user_id, current_date    from day_log
    group by current_date,user_id)as sub
on t.user_id = sub.user_id and sub.current_date = t. current_date
group by sub.user_id,sub. date_current_date;

 

테스트 쿼리를 잘 못 짜서 이런 결과가 있는걸까요?

by 마농 [2019.04.05 13:04:37]

테스트 쿼리가 많이 이상하네요.
 - 서브쿼리도 필요 없고, 조인도 필요 없는 쿼리네요
 - Date(current_date) 사용도 이상하고, 그룹바이도 이상한 쿼리네요.


by r-1y [2019.04.05 15:33:42]

그렇네요  애초에 group by date(current_date)를 하면 끝나는 쿼리였네요. 

밑에 처럼 하면 문제 없는건가요? 또한 Date() 사용이 이상하다는 말씀이 어떤 말씀인지 잘 모르곘습니다.

select user_id
    , date(current_date) as current_date
    , count(*) as current_date
from day_log
group by date(current_date), user_id

by 마농 [2019.04.05 15:51:28]

1. date 필요 없어 보이고
2. Group By 에 current_date 필요 없어 보이네요.
3. COUNT(*) 의 알리아스는 왜 또 current_date 인지?
4. current_date 자체가 이 쿼리에서 꼭 필요한 건지?
 

SELECT current_date
     , user_id
     , COUNT(*) cnt
  FROM day_log
 GROUP BY user_id
;

 


by r-1y [2019.04.05 16:08:25]

일 별로 데이터 분류를 해야 하기 때문입니다.

데이터가 5분 마다 쌓이는데 그걸 일별로 분류를 해야하기 때문에 date 함수를 사용합니다 또한 일별로 분류해야 하기 때문에 2, 4 번 질문에도 답이 됬을까요? 

알리아스는 치다가 잘 못 쳐진거 같네요  


by 마농 [2019.04.05 16:18:28]

current_date 가 테이블의 컬럼명 이었나요?
오늘날짜 가져오는 내장함수 아닌가요?


by r-1y [2019.04.05 16:35:21]

아 넵. 해당 쿼리 컬럼명을 조금씩 바꾸다보니까 질문을 보는 사람들을 생각하질 못했던 거 같습니다 죄송합니다.
얼레 앞에 식별자가 있습니다. c_current_date 이런식으로요

select user_id

    , date(c_current_date) as  c_current_date

    , count(*) as c_current_date

from day_log

group by date(c_current_date), user_id

 


by 마농 [2019.04.05 16:50:29]

글자 하나 차이로...
의미가 전혀 다른 쿼리가 되었네요.


by r-1y [2019.04.05 17:01:33]

죄송합니다.. 혹시 위에 쿼리는 문제가 없을까요?


by 마농 [2019.04.05 17:41:04]

네. 카운트에 대한 알리아스만 바꿔주시면 문제 없습니다.


by r-1y [2019.04.05 17:42:29]

질문의 준비 안되었는데도 친절한 답변 정말 감사합니다. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입