본문 바로가기
프로그래밍/DB & Redis

[DB] 인덱스가 왜 중요한가!!

by 뽀도 2024. 3. 7.


최근에 회사에서 프로그래밍 로직상 이렇게 오래 걸릴리가 없는데 대체 왜 db에 접근해서 처리하는데 시간이 몇시간이나 걸리지??  라는 이슈가 있었다.

 

왜요 왜요 왜

 

 


그래서 해당 함수의 최초 시작 지점부터, sp 내용까지 다 훑어 보았고 의심스러운 부분을 찾았다.

 

UPDATE USER_RANKING
SET nextStartScore = 점수
WHERE userNumber = 유저고유번호 AND seasonNumber = 시즌 번호;

// 아래 테이블은 다 없는 테이블입니다, 설명을 위해 비슷하게 추가했어요 

 

간단히 설명하면 유저고유번호, 시즌 번호를 조건을 걸어서 데이터를 찾아 점수를 업데이트 하는 쿼리이다.

 

우리 게임상 한 시즌이 지날수록 데이터양이 점점 늘어나는 구조였고, 이미 해당 데이터에 20만건이 들어있는 상황이긴 하지만 아무리 20만건이 들어있다고해도  위의 sp를 호출할때마다 1시간 이상 걸리는것은 이상하다고 생각이 들었고, 

 

해당 부분만 mysql explain 해보았다. 

 

id select_type table type possible_keys key key_len ref rows extra
1 SIMPLE USER_RANKING index null PRIMARY 9 null 180087 Using where

 

 

아.....

 

row가 18만이라는건 저 데이터를 처리하려면 18만개를 확인해봐야한다는 의미다. 역시 저 놈이 문제 였구나.

해당 테이블의 인덱스를 확인해보니, 필요 없는 인덱스가 걸려있고 정작 필요한 인덱스는 안걸려 있었다. 

 

그래서 userNumber와 seasonNumber를 인덱스로 걸었고, 다시 Explain 해봤다. 

id select_type table type possible_keys key key_len ref rows extra
1 SIMPLE USER_RANKING range 인덱스 이름 인덱스 이름 14 null 1 Using where

 

확연히 줄어든 rows 수!

 

프로그램을 실행하여 수행속도 테스트를 다시 했고, 1분 ~ 2분 사이로 처리 완료됨을 확인했다.

 

 

 


 

[결론]

 

DB TABLE에 적절한 INDEX를 설정 해두는것이 프로그래밍 성능과 속도에 유리하다.

 

반응형

댓글