인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

zzzzz님의 프로필 이미지

작성한 질문수

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

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

작성

·

106

0

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

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

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;

-- 잘 생성됐는 지 확인

SELECT COUNT(*) FROM users;

 

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

SELECT n + 1 이 먼저 실행되고 FROM cte WHERE n < 1000000 이부분이 실행되니까.

n이 999999까지 실행되고 n + 1 =1000000 이니까 FROM cte WHERE n < 1000000이부분에 걸려서 1000000이 실행 안되는게 맞지 않나요?

답변 1

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 zzzzz님! 질문 잘 주셨습니다:D

 

SELECT n + 1 FROM cte WHERE n < 1000000에서

SELECT n + 1이 먼저 실행되지 않고

FROM cte WHERE n < 1000000이 먼저 실행이 됩니다!

그러다보니 n999999이더라도 정상적으로 쿼리가 실행이 된 것입니다.

 

다른 예로, SELECT age + 10, name FROM users WHERE age < 20;의 쿼리를 생각해봅시다.

여기서 이 쿼리가 실행될 때는 users 테이블에서 age < 20를 만족시키는 데이터를 먼저 뽑은 뒤에

그 뒤에 age + 10의 값과 name의 컬럼을 조회해서 출력합니다.

 

위 설명 중에서 이해 안 되시는 점 있으시면 댓글 남겨주세요~~

zzzzz님의 프로필 이미지

작성한 질문수

질문하기