ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DB] 인덱스로 조회시 개선되는 성능 확인해보기
    Backend/개발 2022. 2. 23. 20:33
    반응형

    DB의 인덱스 라는 개념이 분명히 우리가 목차나 여러가지 인덱스를 접할 기회가 많은데도 되게 와닿지 않는다고 느꼈다.

    아무리봐도 이론으로 글만 보려니까 재미가 없어서 그런지.. 그래도  중요한 개념이라 정리해보고 있는데 그런김에 실습을 한번 해보았다. 

     

    현재 하고있는 토이프로젝트에 1년간 쌓인 게임 데이터는 총 1200개이고 한 판에 참가하는 인원이 10명이라 참가자에 대한 데이터는 12000개가 쌓여있었다.

     

    만약에 챔피언ID를 기준으로 해당 챔피언을 사용한 게임을 조회한다거나, 뭐 count를 세서 기간내에 가장 많이 사용된 챔피언이 무엇인지 검색할 일이 있다면 !?

     

     

    일단 mysql query 몇가지를 정리해본다.

    select count(*) as cnt from game_record_participants;
    select champion_id, count(champion_id) from game_record_participants group by champion_id order by count(champion_id);

     

    1. 첫번째는 현재 저장된 디비 테이블의 총 레코드 수를 카운트 한 쿼리이다. 보이는것 처럼 12271개의 데이터가 저장되어있다. (10의배수여야되는데왜 1이있지.?;;테스트 데이터인가)

     

    2. 두번째는 champion id의 분포도를 보기 위해 champion_id와 champion_id로 묶어 count를 출력해보았다.

    여담이지만 여기서 89번은 레오나 117번은 룰루이다, , 1200판중에 레오나가 거의 30% ..

    제일 count가 적은 값은 1,2,..들도 있는데 평균적으로 1200테이블에 한 championid가 가지는 분포도가 100개정도를 가지고있다고 하면 인덱스로 쓰기에 적절한거같다는 생각이 들었다 !!

     

     

    다음은 실제 테스트를 해보았다.

    -- 테스트할 코드 
    select * from game_record_participants where champion_id = 87;
    
    -- 테이블에 인덱스를 추가하는 코드 
    alter table game_record_participants add index champion(champion_id);
    -- 테이블에 인덱스를 지우는 코드 
    alter table game_record_participants drop index champion;
    
    -- 인덱스를 확인하는 코드 ( PK는 기본으로 인덱스로 생성되어있었다 )
    show index from game_record_participants;

    select * from game_record_participants where champion_id = 87; 이 쿼리를 날렸을 때 인덱스가 있고 없고에 따라 쿼리 시간이 얼마나 되는지 분석해보았다 !

    먼저 이건 인덱스 리스트인데 이미 PK인 3개 키는 인덱스로 들어가있고, champion_id가 추가되었다. 여기서 cardinality는 중복된 정도를 나타내고, index_type이 BTREE로 되어있는 것도 볼 수 있다. 

     

    테스트 1 

    먼저 인덱스를 지우고 조회를 했을 땐 0.0029sec, 인덱스를 추가하니 0.0013sec로 반이나 준 것을 볼 수 있었다!

     

    테스트2

    가장 많은 count를 가졌던 89번으로 조회했더니  0.0020->0.0014 반정도는 아니지만 그래도 많이 줄었다.

     

    테스트3

    19개의 데이터만 가지는 champion_id로 조회를 했더니 0.015-> 0.00092sec 

    진짜 엄청 속도가 향상되는것을 볼 수 있었다..

     

    인덱스라는게 감이 잘 안왔는데 이렇게 직접 쿼리를 날려서 확인해보고나니 인덱스를 활용할만한 검색이 있다면 안 쓸 이유가 없다는게 더 체감이 됐다.

    하지만 이건 좀 단편적인 예시고 실제로 champion_id로 조회하는 API는 없을 뿐더러,, 다른거랑 연관이 어떻게되는지는 더 생각해 봐야 할 것 같다. 그래도 인덱스라는걸 사용했을 때 select자체의 성능이 정말 좋아진다는건 눈으로 볼 수 있는 좋은 기회였다 ~ 

     

    이번엔 좀 가볍게 인덱스라는 개념을 실제로 눈으로 보고 익히고 싶어서 가볍게 테스트해봤지만 나중에 확실한 기준을 가지고 더 활용될 수 있는 데이터들이나 성능 개선 방안을 더 찾아봐야겠다! 

     

    댓글

Designed by Tistory.