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)

Tiếp theo nên học gì?

질문이있습니다.

306

alopp

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

1

제가 선생님 강의를보고

테이블에 천만개의 데이터를 넣고 인덱스를 테스트하고있었는데요,

 

2가지 질문이 생겼습니다.

 

  1. 질문

    다음과 같이 익스플레인 에널라이즈를 하면 소요시간이 약 704ms 으로 나옵니다.

 

그런데 익스플레인 에널라이즈만 제거하고 다시 셀렉트를 하면 소요시간이 1.494로 증가하는데

 

단순 조회 쿼리와 익스플레인 에널라이즈 쿼리가 서로 다르게 동작해서 그런건가요?

 

분석때문에 에널라이즈쪽이 더 오래걸릴까 싶었는데 오히려 반대라서 왜 이런현상이 발생하는지 궁금합니다.

-> Filter: ((reservation.userId = 389788) or (reservation.seatId = 50))  (cost=11192 rows=10272) (actual time=2.33..678 rows=10271 loops=1)
    -> Deduplicate rows sorted by row ID  (cost=11192 rows=10272) (actual time=2.3..676 rows=10271 loops=1)
        -> Index range scan on reservation using idx_user over (userId = 389788)  (cost=1.11 rows=1) (actual time=0.115..0.115 rows=0 loops=1)
        -> Index range scan on reservation using idx_seat over (seatId = 50)  (cost=1038 rows=10271) (actual time=0.0497..2.77 rows=10271 loops=1)

 

  1. 질문


    제가 다음과 같은 쿼리에 인덱스를 걸며 테스트해보니


    복합인덱스 ( userId,seatId or reverse ) 는 전혀 인덱스를 활용하지않고 단일 인덱스를 각각 지정했을 경우에만 아래와같이 인덱스를 병합해서 사용하더라구요. 이렇게 속도를 절반으로 떨어뜨렸는데 아무래도 데이터가 천만개라 그런가 여전히 1초 이상의 시간이 소요되어서 선생님이 보셨을때 여기서 더 개선해볼 방법이 있는지 궁금합니다.

    where쪽을 건드려 보자니 둘중 하나라도 충족되면 가져와야하는 상황이라면 or 말고 다른건 떠오르질않았습니다.
    (에널라이즈는 시간이 1초 미만으로 나오지만 실제로 쿼리 돌려보면 소요시간 1.4초 이상으로 찍힙니다. )

CREATE INDEX idx_user ON reservation_entity(userId);
CREATE INDEX idx_seat ON reservation_entity(seatId);

SELECT
  `reservation`.`createdAt` AS `reservation_createdAt`,
  `reservation`.`updatedAt` AS `reservation_updatedAt`,
  `reservation`.`deletedAt` AS `reservation_deletedAt`,
  `reservation`.`id` AS `reservation_id`,
  `reservation`.`userId` AS `reservation_userId`,
  `reservation`.`concertId` AS `reservation_concertId`,
  `reservation`.`seatId` AS `reservation_seatId`,
  `reservation`.`status` AS `reservation_status`,
  `reservation`.`price` AS `reservation_price`,
  `reservation`.`concertName` AS `reservation_concertName`,
  `reservation`.`seatNumber` AS `reservation_seatNumber`,
  `reservation`.`openAt` AS `reservation_openAt`,
  `reservation`.`closeAt` AS `reservation_closeAt`
FROM 
  `reservation_entity` `reservation`
WHERE 
  `reservation`.`userId` = 389788 
  OR `reservation`.`seatId` = 50; 

-> Filter: ((reservation.userId = 389788) or (reservation.seatId = 50))  (cost=11192 rows=10272) (actual time=2.33..678 rows=10271 loops=1)
    -> Deduplicate rows sorted by row ID  (cost=11192 rows=10272) (actual time=2.3..676 rows=10271 loops=1)
        -> Index range scan on reservation using idx_user over (userId = 389788)  (cost=1.11 rows=1) (actual time=0.115..0.115 rows=0 loops=1)
        -> Index range scan on reservation using idx_seat over (seatId = 50)  (cost=1038 rows=10271) (actual time=0.0497..2.77 rows=10271 loops=1)

sql mysql dbms/rdbms query-tuning

Câu trả lời 1

0

jscode

안녕하세요 alopp님! 좋은 질문 해주셨네요👍😊
하나씩 답변 드려보겠습니다.

 


  1. 저도 이 부분은 왜 그런지 궁금해서 검색을 좀 해봤어요! 확실하진 않지만 추측하고 알게 된 정보를 알려드려 볼게요!

    일반적으로는 EXPLAIN ANALYZE가 분석을 같이하기 때문에 시간이 더 오래걸리는 경우가 많습니다. 하지만 EXPLAIN ANALYZE를 처리할 때 내부적으로 실제 Query를 실행시키지 않고 추정(샘플링)을 통해 조금 더 효율적으로 처리를 할 수도 있다고 합니다! 이런 이유로 인해 EXPLAIN ANALYZE로 처리했을 때 응답 시간이 더 작게 나올 수도 있습니다.

 


  1. 복합 인덱스를 활용하지 않은 이유는 WHERE문에서 AND가 아닌 OR 조건을 활용했기 때문입니다. 그리고 인덱스를 활용했음에도 불구하고 시간이 오래 걸리는 이유는 최종적으로 반환하는 데이터 개수가 많아서 오래 걸린다고 예상할 수 있습니다. 그리고 많은 데이터들을 가지고 Deduplicate 작업을 함으로써 시간이 오래 걸린 것으로 예상되네요!

    이 외로 궁금하신 점 있으시면 편하게 질문 또 남겨주세요~~~

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

0

8

1

쿼리 결과 그리드에서 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

256

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

테이블에 기본키가 없을때

0

376

1

질문있어요!!!

1

208

1