개발이야기/DataBase
모든 쿼리는 index를 타야 제맛이쥐
대머리개발자
2024. 9. 4. 14:21
728x90
SELECT id, action, regDt
FROM Product
WHERE action = 'EARN_TODO'
AND style = 'POINT'
AND regDt > DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND regDt < DATE_SUB(CURDATE(), INTERVAL 6 DAY)
VS
SELECT id, action, regDt
FROM Product
WHERE action = 'EARN_TODO'
AND style = 'POINT'
AND DATEDIFF(CURDATE(), regDt) = 7
EARN_TODO를 정확히 7일 후에 조건이 충족되면 EARN으로 UPDATE 해줘야 한다.
따라서 UPDATE할 대상을 조회하고자 할 때 어떤 쿼리가 더 효과적인지는..
일단 무조건 피해야할 조건은 컬럼의 함수나 연산을 좌측에 두면 안 된다.
⭐⭐인덱스가 타지 않는다.
그럼 이미 답이 나왔지유!
But!!! 애초에 데이터베이스 설계를 잘 했다면 더 깔끔해진다.
SELECT id, action, regDt
FROM Product
WHERE action = 'EARN_TODO'
AND style = 'POINT'
AND regDt = DATE_SUB(CURDATE(), INTERVAL 7 DAY)
날짜(regDt) 타입은 무조건! 그냥! dateTime으로 했는데..
필요하다면 단순 날짜형(date)으로 설정해도 되겠다.
더 깔끔하게 아예 별도 이용 가능 날짜의 컬럼을 파서!!!.. 등록할 때 관련 데이터도 넣는다..!!
SELECT id, action, regDt
FROM Product
WHERE action = 'EARN_TODO'
AND style = 'POINT'
AND availableDt = CURDATE()
데이터 설계를 잘하자!!
728x90