데이터베이스 자동채번 MAX() vs OREDER BY LIMIT

 

  • 데이터베이스 내에서 가장 큰값을 뽑아내 +1을 시키는 자동채번을 구현해야 한다
  • 큰값을 가져올때 MAX를 이용하는게 좋을까 아니면 ORDER BY DESC LIMIT을 사용하는게 좋을까

결론으로 말하자면 인덱싱 되지않은 필드라면 MAX()가 좀더 성능상으로 좋다

 


 

MAX()

 

SELECT MAX(FIELD)

FROM SAMPLE_TABLE

 

 

SAMPLE_TABLE안에 MAX()를 이용해 FIELD 칼럼에 가장 큰 값을 가져올때 다음과같은 과정을 거친다

인덱싱되지 않은 최악의 경우 MAX()를 사용하면 테이블을 풀스캔하면서 가장큰값을 도출한다

 

그 결과 테이블 전체를 한번만 통과하면 가장큰값을 가져올수있다

인덱싱이 된 필드도 결국 순회해야하기 떄문에 최악과 최적이 거의 차이가 없다고 볼수있다

 

 

 

ORDER BY LIMIT

 

SELECT FIELD

FROM SAMPLE_TABLE

ORDER BY FIELD DESC

LIMIT 1

 

 

인덱싱 되지않은 필드에 ORDER BY LIMIT을 사용할경우 다음과같은 절차를 거치게된다

우선 FILED에 대해서 SORT를 하고 LIMIT으로 가져오는 작업을 거치게되는데

 

데이터가 많은 테이블에 경우 실제로 MAX()와 비교했을때 유의미한 성능차이를 가져올수있다

106,000개 행 테이블에 대해 MAX()를 수행한결과 .36초가 걸리고 ORDER BY에 경우 0.84초가 걸렸다고한다

 

하지만 인덱싱이 된 FIELD라면 MAX()와 거의 차이가 나지 않는다

 

 

결론

 

상위 N개의 결과를 가져온다거나 N번째 ~ M번째 결과를 가져온다거나 하는 작업을 할때는

ORDER BY LIMIT을 사용해야한다

 

하지만 간단하게 가장 큰값을 가져온다면 MAX()나 MIN()을 사용하는것이 바람직하다

무엇보다 가장좋은것은 간단한 쿼리를 통해서 해결하는것이 좋은 방법이라고 생각한다

 

다양한 사람들의 여러 견해를 보고싶다면 여기를 참고하면 좋을것같다

 

ORDER BY LIMIT이 성능상으로 더좋은 결과를 도출하는 경우도 있으니 찾아보면 좋을것같다