inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)

실행 계획에서 type 의미 분석하기 (const, range, ref)

큰 범위 조회 시 EXPLAIN의 rows 값이 정확하지 않은 이유가 궁금합니다.

4

박신형

작성한 질문수 1

0

안녕하세요 강사님.

[실행 계획에서 type 의미 분석하기 (const, range, ref)] 강의에서 "Index Range Scan할 때 조회 범위가 크면 성능 저하의 원인이 되기도 한다."라는 내용을 듣고 정말인지 궁금해져서 EXPLAIN을 한번 돌려봤습니다.

CREATE TABLE users (

    id INT AUTO_INCREMENT PRIMARY KEY,

    name VARCHAR(100),

    age INT

);

-- 높은 재귀(반복) 횟수를 허용하도록 설정

-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)

SET SESSION cte_max_recursion_depth = 1000000; 



-- 더미 데이터 삽입 쿼리

INSERT INTO users (name, age)

WITH RECURSIVE cte (n) AS

(

  SELECT 1

  UNION ALL

  SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성하고 싶은 더미 데이터의 개수

)

SELECT 

    CONCAT('User', LPAD(n, 7, '0')),   -- 'User' 다음에 7자리 숫자로 구성된 이름 생성

    FLOOR(1 + RAND() * 1000) AS age    -- 1부터 1000 사이의 난수로 나이 생성

FROM cte;



CREATE INDEX idx_age ON users (age);



EXPLAIN SELECT id FROM users

WHERE id BETWEEN 1 AND 100000; -- type : range
스크린샷 2026-04-26 오후 6.15.36.png.webp

결과 창에서 rows가 100,000이 아니라 110,836으로 나오더라고요. 옵티마이저가 id는 PK이라서 중복이 없을 거라는 것을 알고 Auto Increment가 적용되어 있어서 순차적으로 데이터가 들어갔음도 알텐데 왜 10만 개로 딱 떨어지게 예측하지 못하는지 직관적으로 잘 이해가 가지 않습니다.

감사합니다.

sql mysql dbms/rdbms query-tuning

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 박신형님!

질문 주신 부분은 SQL 쿼리 실행 계획의 주요 내역 중 하나로, EXPLAIN을 사용해서 조회한 결과에서 rows 값이 예상보다 더 많은 경우에 대해 설명드리겠습니다.

EXPLAINrows 값은 MySQL이 특정 쿼리를 통해 처리할 예상 레코드 수를 제공합니다. 이 값은 실제 데이터베이스 통계와 분석을 바탕으로 산출됩니다. 그러나 이러한 예상치는 현실과 약간의 편차가 있을 수 있으며, 이를 이해하는 데 있어 몇 가지 고려 사항이 필요합니다.

  1. 통계 기반 예측: EXPLAINrows 값은 데이터베이스 엔진이 테이블의 통계를 바탕으로 내부 알고리즘을 통해 추정한 결과입니다. 이는 인덱스되는 키의 분포와 해당 키 값의 변경 상태에 따라 변동이 있을 수 있습니다.

  2. 샘플링 결과: 데이터베이스 시스템은 일부 쿼리 실행 계획에서 통계적 샘플링을 사용하는데, 이때 항상 정확한 샘플 결과를 반영하지 않을 수 있습니다. 이러한 샘플링은 대규모 데이터에서 빨리 결과를 도출하기 위한 방법이며, 이로 인해 실제와 예상 수치 사이에 차이가 발생할 수 있습니다.

  3. 옵션 및 설정 상태: MySQL의 내부 설정이나 데이터베이스 버전에 따라 통계 정보의 정확성이 차이가 날 수 있으며, 이는 실행 계획의 예측 정확성에 영향을 줍니다.

질문하신 문제의 본질은 데이터베이스 통계의 불확실성과 데이터를 다루는 방식의 차이에 따라 발생하는 흔한 현상입니다. 이와 관련하여 비슷한 문제를 다룬 유사 질문과 설명을 참고하시기를 권장합니다.

  • ORDER BY 튜닝관련 문의: 이 게시물에서는 EXPLAIN의 예측치를 설명하고 실제 실행 결과와의 차이에 대한 이해를 돕습니다.

저는 질문자님의 이해를 돕고자 이런 유사한 답변 링크를 참고하여 추천해 드리고 있음을 알려드립니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

쿼리 결과 그리드에서 TYPE, POSSIBLE_KEYS 다릅니다

0

78

3

강의 내용을 블로그에 정리해도 괜찮을까요?

1

117

2

여러 테이블 조인시 where 절이 필요한가? 에 대해 질문있습니다.

0

141

2

풀 인덱스 스캔 질문있습니다.

0

117

2

멀티컬럼인덱스 질문있습니다.

0

119

2

쿼리 튜닝 관련 질문 (limit)

0

117

1

페이지기반 페이지네이션 쿼리를 최적화하고 싶습니다.

0

165

2

측정 시간 차이

0

197

2

[실습] 인덱스 직접 설정해보기 / 성능 측정해보기 강의에서요.

0

193

1

커버링 인덱스(Covering Index)강의에서 질문이있습니다.

0

181

2

한 번에 너무 많은 데이터를 조회하는 SQL문 튜닝하기 질문입니다

0

255

3

ORDER BY 튜닝관련 문의

0

198

2

강의 질문 있습니다

0

116

2

인덱스 많은 테이블에서 데이터 많아질 수록 insert 속도 증가

0

439

3

MariaDB 사용 시 EXPLAIN ANALYZE 이용 불가 문의

1

586

2

SQL 튜닝에 대한 사례나 Best Practice 등을 모은 자료를 알려주실 수 있나요?

0

317

2

혹시 심화 수업은 계획이 없으신가요..?

0

292

1

jpa쿼리튜닝 팁이 궁금합니다.!

0

447

1

특정 부서에서 최대 연봉을 가진 사용자 조회 sql 쿼리 질문

4

243

1

created_at 에 index 거는것과 지속적인 데이터 증가

0

420

2

WHERE A OR B 에서 인덱스 걸기

0

372

2

질문이있습니다.

1

306

1

테이블에 기본키가 없을때

0

376

1

질문있어요!!!

1

208

1