대용량 데이터를 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;
성능 표 분석은 여길 참고하자.
http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21444&cat1=7&cat2=217&cat3=227&lang=k
===== 2020.12.22 수정
#2. 쿼리에 대해서 '의문' 이라고 썼는데, 여기 블로그에 기재된 글을 참고하니 성능이 좋은 쿼리였네요.
아직 갈 길이 멀었나봅니다. 빠팅!
===== 2021.03.02 수정
해당 포스팅은 AI PK 를 추가하여 '어떻게' 쿼리를 다루면 좋을까에 대한 포스팅 입니다. (조언 감사합니다.)
반응형
'SQL > MySQL' 카테고리의 다른 글
[MySQL] Delete 쿼리 Syntax Error (delete query in subquery) (0) | 2021.03.19 |
---|---|
[MySQL] localhost root 비밀번호 까먹었을 때 (mac) (0) | 2020.03.02 |
[MySQL] 대용량 text 파일(.txt) DB 에 업데이트 하는 방법 (feat.행안부) (0) | 2020.01.20 |
unsigned 사용하는 이유 (0) | 2018.10.29 |
MySQL 에서 위도 경도에 알맞는 데이터 타입 (0) | 2018.07.05 |
댓글