안녕하세요, 가장최근값 불러오는 쿼리에대한 고민입니다 0 6 751

by 둘기 [MySQL] limit [2020.04.29 13:39:40]


안녕하세요,

현재 해당유저의 가장 최근 데이터 1개를 꺼내와야되는 상황입니다

원래는 이런 쿼리를 사용하고있습니다.

SELECT user_id, today_total_data ,total_data, time_stamp
FROM user_data
WHERE user_id = ? AND time_stamp >= date_add(now(), interval -1 hour)
ORDER BY time_stamp DESC
LIMIT 1


최근 1시간내 데이터중에 가장최근값 1개를 꺼내오는 방식입니다

하지만 최근 1시간내 데이터가 없는경우 에러가 발생하는 문제가 있었습니다 ( 1~2일동안 없는경우도 있습니다 ) 

 

그래서 아래와 같은 쿼리로 변경했습니다 

SELECT user_id , time_stamp, today_total_data, total_data
    FROM user_data
    WHERE user_id = ?
    AND time_stamp = (
         SELECT MAX(time_stamp)
         FROM user_data
         WHERE user_id = ?
          )

 

혹시더 좋은방법이 있다면 조언 부탁드립니다 

by 샤랄라 [2020.04.29 14:03:45]
-- time_stamp 조건을 빼세요

SELECT user_id, today_total_data ,total_data, time_stamp
FROM user_data
WHERE user_id = ?
ORDER BY time_stamp DESC
LIMIT 1 ;

 


by 둘기 [2020.04.29 15:05:07]
SELECT user_id, today_total_data ,total_data, time_stamp
FROM user_data
WHERE user_id = ?
ORDER BY time_stamp DESC
LIMIT 1 ;


 
이게 처음에하려고했던 쿼리인데,
데이터가 하루에 수만건씩 쌓여서, 나중에 성능에 문제가 생길것같아서 
time_stamp조건을 추가했었습니다
성능적인 면에서 그냥 조건을빼고 사용해도 상관없을까요?


by 마농 [2020.04.29 14:05:55]

결합 인덱스 구성이 (user_id, time_stamp) 로 되어 있다면?
2번 쿼리도 나쁘지 않은 방법입니다.
1번 쿼리에서 time_stamp 조건만 빼도 되는 부분이구요.
8.0 버전 이상이라면? ROW_NUMBER() 를 이용할 수 있습니다.


by 둘기 [2020.04.29 15:04:38]
SELECT user_id, today_total_data ,total_data, time_stamp
FROM user_data
WHERE user_id = ?
ORDER BY time_stamp DESC
LIMIT 1 ;

이게 처음에하려고했던 쿼리인데,
데이터가 하루에 수만건씩 쌓여서, 나중에 성능에 문제가 생길것같아서 
time_stamp조건을 추가했었습니다
성능적인 면에서 그냥 조건을빼고 사용해도 상관없을까요?

 


by 마농 [2020.04.29 15:24:05]

결합인덱스가 있어야 하구요.
이게 없다면? 몇가지 대안으로 드린 방법들이 성능은 비슷하게 나올 것 같습니다.
실행계획등 확인은 필요하겟지요.


by 둘기 [2020.04.29 16:29:13]

답변 감사합니다

결합인덱스는 따로 찾아봐야겠네요 

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