데이터베이스/RDB
[MySQL] 인덱스를 활용한 Join 성능 개선
옥탑방고래
2022. 9. 22. 23:10
현상
여러 테이블을 Join 하여 Select을 했는데 꽤 오래 걸려서 쿼리를 분석하기위해 explain 을 쿼리앞에 붙혀서 실행했다.
결과로 rows 값이 비정상적으로 많은 테이블을 발견했다. extra를 확인해보니 Using join buffer(Block Nested Loop)라는 내용이 있었다
원인
Using join buffer(Block Nested Loop) 의 의미는 조인에 적절한 인덱스가 없어 조인 버퍼를 이용했음을 뜻하는데
결과적으로 테이블 조인 조건을 PK와 달리 인덱스가 없는 컬럼에 걸어서 오래 걸렸던 것이다.
해결
CREATE INDEX 인덱스이름
ON 테이블이름 (필드이름1, 필드이름2, ...)
해당 컬럼에 인덱스를 추가하여 다시 SELECT 해본 결과 성능이 개선됐다.
하지만 무작정 인덱스를 쓰는건 좋지않다. 아래는 단점 사항이다.
- 인덱스 정보를 저장할 추가 저장 공간이 필요
- INSERT, DELETE, UPDATE 시 성능 저하
- 데이터가 많은 테이블이라면 처음 인덱스 만드는데 오래 걸릴 수 있다.
결국 인덱스를 상황에 맞게 사용한다면 보다 나은 성능을 기대할 수 있을 것이다.
<참고> https://rebro.kr/167