inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Nhập môn và Thực hành Tối ưu hóa hiệu suất MySQL dành cho cả người không chuyên (Phần Tuning SQL)

Phân tích ý nghĩa của type trong kế hoạch thực thi (const, range, ref)

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

8

limo730

1 câu hỏi đã được viết

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

Câu trả lời 1

0

communityai8509

안녕하세요, 인프런 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

318

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