[MySQL] MySQL LIMIT의 속도 저하 피하기

MySQL을 사용하다 보면 무분별하게 나도 모르게 무분별하게 LIMIT를 사용하는것을 볼 수 있다.

다른 개발자분들은 어떠신지 잘 모르겠지만, 대용량 데이터베이스에서는 LIMIT만큼은 절대로 피해야 한다.

실제로 예전에 10억개의 데이터를 가공하는데 LIMIT를 쓰니 쿼리 하나가 몇일이 걸리는 사태가 발생하곤 했다.

사용자 삽입 이미지
간단하게 테스트 테이블을 만들어서 테스트 해보자. 데이터는 2천만개가 들어있다. 천만개째부터 5만개를 가져오는 쿼리이다.
11.216초 걸렸다.

사용자 삽입 이미지
EXPLAIN을 찍어보니 인덱스를 타지 않는것을 알 수 있다. 인덱스만 타도 좋을텐데…

사용자 삽입 이미지
위와 같이 쿼리를 바꿔보았다. 0.031초 걸렸다. 위와 같이 바꾸었을때 단점은 게시판처럼 동적으로 글이 늘어나는경우 IDX값을 정의하기 어렵다. 하지만 게시판 같은 경우에는 글쓴시각등으로 처리하는 방법등이 존재한다. 잘 고민하여 설계해 보자.

사용자 삽입 이미지
EXPLAIN을 찍어보니 인덱스를 타는것을 알 수 있다. 인덱스를 타고 천만번째로 바로 이동한 다음에 5만개를 가져올것이다.

  • 강정임

    질문이 생겼어요 ^^;

    제 생각에는 Limit이 문제가 아니라 인덱스를 타지 않는 쿼리아닌가하는 생각이 들어서요..
    예를들자면
    select * from test_table order by idx desc limit 10000000, 5000
    이런 식으로 하면 인덱스 탈거같아서요
    혹시 가능하시면 테스트…?

  • 다엘아빠

    글쓴날로부터 한참 지났지만.. 좀 확인 해 보자면,
    우선 where 절이 없으면 당연 Full Scan 들어 가지 않나염??

    where 절을 통해서 부분범위 검색을 걸어야 인덱싱 되는지 않되는지 확인 될텐데…

    따라서 테스트를 위한 쿼리는

    select * from TEST_TABLE where IDX > 0 LIMIT 10000000, 5000

    select * from TEST_TABLE where IDX > 10000000 LIMIT 5000

    로 테스트를 했어야 된다고 봅니다.

    • 아이

      듣고 보니깐 맞는 말씀이시네요. 제가 좀더 정확한 비교를 하지 못한거 같습니다. 조언 감사드리고요, 조만간 이 글을 수정하도록 하겠습니다.
      감사합니다~~!