본문 바로가기
SQL/MySQL

[MySQL] 대용량 데이터 select 시 limit 사용 주의점

by 지구 2020. 12. 22.

대용량 데이터를 RDB 로 관리하던 중, 아래와 같이 limit offset 을 사용하며 select 할 때 문제가 있었다.

-- 0부터 시작하는 offset 은 빨랐지만
SELECT * FROM my_table LIMIT 0, 5000;

-- offset 이 높을수록 성능이 저하가 되었다. (속도 느림)
SELECT * FROM my_table LIMIT 1000000, 5000;

위 쿼리는 이와 같은 성능을 지닌다. >> 매우 안좋음

 

조금만 구글링해도 나오는 원인이었는데.. 단순 LIMIT 는 인덱스를 타지 않아서

두번째 쿼리 같은 경우는 100만번까지 쿼리를 읽고 거기에서 5천개를 가져오는거라서 느릴 수 밖에 없었다.

 

그에 따른 해결방법은 아래와 같았음을 기록..

-- #1.
SELECT * FROM my_table WHERE my_table_pk BETWEEN 1000000 AND 1005000;

-- #2.
SELECT *
FROM my_table mt
JOIN (
    SELECT my_table_pk
    FROM my_table
    LIMIT 1000000, 5000
) AS a
ON a.my_table_pk = mt.my_table_pk

-- #3.
SELECT * FROM my_table WHERE my_table_pk > 1000000 LIMIT 0,5000;

-- #4.
SELECT * FROM my_table WHERE my_table_pk > 1000000 ORDER BY my_table_pk LIMIT 0,5000;

 

#1. type 이 ALL 로 찍혔으며, 읽힌 rows 도 많다. >> 사용하긴 버거움
#2. 인덱스를 탄듯하나 불필요한 조인이 걸린 느낌이다. >> 사용하기 적합할까? 의문
#3. 1번과 유사함.
#3. 엄청 좋다곤 할 수 없지만, 인덱스를 탔으며 이 중 가장 괜찮은 쿼리로 보임 >> 사용해도 괜찮아 보임

성능 표 분석은 여길 참고하자.
http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21444&cat1=7&cat2=217&cat3=227&lang=k

 

:::MySQL Korea:::

7.2.1.  EXPLAIN을 사용해서 쿼리 최적화 하기 EXPLAIN tbl_name 또는: EXPLAIN [EXTENDED] SELECT select_options EXPLAIN 명령문은 DESCRIBE에 대한 동의어로 사용할 수 있거나 또는 MySQL이 SELECT 명령문을 실행하는 방법

www.mysqlkorea.com

 

===== 2020.12.22 수정

#2. 쿼리에 대해서 '의문' 이라고 썼는데, 여기 블로그에 기재된 글을 참고하니 성능이 좋은 쿼리였네요.
아직 갈 길이 멀었나봅니다. 빠팅!

 

===== 2021.03.02 수정

해당 포스팅은 AI PK 를 추가하여 '어떻게' 쿼리를 다루면 좋을까에 대한 포스팅 입니다. (조언 감사합니다.)

 

 

반응형

댓글