얼마 전, Tomcat 카테고리에 jPetStore를 올린 적이 있습니다.

당시 MariaDB에 데이터를 올렸는데 페이지 처리를 위하여 limit 구문을 사용하였습니다. 즉, 카테고리 내 목록을 보기 위하여 ibatis단에서 다음과 같이 처리를 했지요.

select productid, name, descn, category from product where category = #categoryId# limit #start#, #pageCount#

(예를 들어, 60번 째 부터 20건을 가져올 때 limit 60, 20 이 됩니다)

 

그런데 product 테이블에 데이터가 점점 증가하면서 눈에 띄는 성능 하락이 발생하였습니다. 결론적으로 원인은 바로 limit이었는데요, limit 40000, 20처럼 4만번 째 부터 20건을 가져오려고 한다면 40,000건 까지 계속 skip 후에 드디어 20건을 가져오는 매커니즘을 가진 것이 바로 limit 이었습니다.

 

그리고 다음과 같이 DBA의 도움을 받아 쿼리 튜닝을 한 후에 문제를 해결할 수 있었습니다.

select productid, name, descn, category from product inner join (
  select productid from product where category = #categoryId# limit #start#, #pageCount#) as b
using(productid)

 

* MariaDB (MySQL) 의 페이지 처리에 대해서는 여전히 많은 논쟁이 있습니다. 다른 의견 환영합니다.