대머리개발자

모든 쿼리는 index를 타야 제맛이쥐 본문

개발이야기/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