Tag Archives: 데이터베이스

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

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

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

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

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

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

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

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

[MySQL] MySQL의 Oracle의 ROWNUM을 사용하기

MySQL에서 Oracle의 ROWNUM같은 기능을 사용할려면 어떻게 해야 할까?

다음과 같은 방법으로 손쉽게 사용 가능하다.

[code lang-sql]SELECT
    @ROWNUM := @ROWNUM + 1 AS ROWNUM,
    TEST_TABLE.*
FROM
    TEST_TABLE,
    (SELECT @ROWNUM := 0) R[/code]

ROWNUM을 이용하여 다른 작업을 하기위해서는 다음과 같이 서브쿼리를 이용하면 된다.

[code lang-sql]SELECT
    A.*
FROM
(
    SELECT
        @ROWNUM := @ROWNUM + 1 AS ROWNUM,
        TEST_TABLE.*
    FROM
        TEST_TABLE,
       (SELECT @ROWNUM := 0) R
) A
WHERE
    A.ROWNUM < 100[/code]