본문 바로가기

개발일기장

실행 분석 계획을 통해 인덱스 성능을 알아보자(삽질했어요.)

테이블 레코드 수 32563개

실제 불러와야 할 데이터 1119개, 인덱스 적용/미적용으로 비교합니다.


인덱스 적용 시

쿼리를 이해할 필요는 없고 인덱스가 적용되었다는 것만 알고가면 될 것 같습니다.

 

2행을 보시면 됩니다. index lookup은 특정 레코드를 조회하기 위해 인덱스가 사용되었음을 의미합니다.

actual time 0.188..4.904 라는 의미는 첫 레코드에 접근한게 0.18ms 다 읽는데 평균 4.9ms가 걸렸다는 의미입니다. 인덱스를 적용햇기 딱 필요한 1119개만 스캔합니다.

 

 

인덱스 미적용 시

4행을 보면 ignore index가 보이시죠? index를 사용하지 않고 쿼리의 실행 분석을 보겠습니다.

 

여기서도 3행만 집중해서 봅시다. Table scan 은 테이블 전체 레코드를 순차적으로 다 읽었다는 의미입니다. 끝에 보면 rows 가 이전과는 다르게 32563입니다. 첫 레코드를 읽는데 0.12ms 다 읽는데 평균 53.6ms가 걸렸습니다.

 


인덱스를 적용해서 11배 정도의 조회 성능 향상이 나타났습니다. 인덱스에 대해 더 고민해볼 수록 이정도의 성능 향상을 위해 꼭 인덱스를 적용해야할지는 아직 잘 모르겠습니다.

 

Index는 결국 SELECT와 INSERT 간의 trade-off 이기 때문에 잘 고려해야 할 것 같습니다.

 

Index에 대한 더 자세한 설명은 이후에 하도록 하겠습니다. 지금은 너무 많은 내용이 정리되지 않은 채 존재해서 어떻게 정리해야 할지 감이 안오네요 :)

 

여담으로 저는 처음에 실행 시간 단위가 ms가 아닌 second로 생각했습니다 ㅋㅋㅋㅋㅋ

그런데 application단에서 index가 미적용된 API를 호출했을 때가 더 빠를때가 있길래 도대체 이게 뭘까? 말이되나? 싶었네요... 진짜... 하루 종일 이것 떄문에 고민이 많았는데... MySQL 개발 문서에서 해답을 찾을 수 있었습니다...

 

 

MySQL :: MySQL EXPLAIN ANALYZE

MySQL 8.0.18 was just released, and it contains a brand new feature to analyze and understand how queries are executed: EXPLAIN ANALYZE. What is it? EXPLAIN ANALYZE is a profiling tool for your queries that will show you where MySQL spends time on your que

dev.mysql.com

 

흑흑... 이제 자야겠다...