[MySQL] 인덱스 사용 판단 기준
MySQL에서 인덱스를 잘 사용하면 검색 성능을 높일 수 있습니다. 하지만 잘못 사용하면 오히려 역효과를 줄 수도 있습니다. 양날의 검 같은 존재입니다. 그래서 어떤 경우에 사용해야 하고, 어떤 경우에 사용하지 말아야 할지를 잘 판단해야 합니다. 하지만 워낙 case-by-case이기 때문에 단정적으로 어떤 컬럼에 인덱스를 사용해야 한다고 말하기가 쉽지 않습니다. 클러스터형 인덱스를 사용해야 하는 경우도 있고, 보조 인덱스를 사용해야 하는 경우도 있고, 아예 사용하지 않는 것이 나은 경우도 있습니다. 하나의 완벽한 답은 없지만, 더 나은 답은 존재합니다. 그 더 나은 답은 많은 경험과 논리적 사고를 통해서 찾을 수 있습니다. 아래의 내용은 인덱스 사용과 관련하여 어느 정도 갈피를 잡을 수 있게 도와주는 지침이 될 것 같습니다. [1]에서 읽은 내용을 제 언어로 정리해봤습니다.
인덱스를 사용해야 하는 경우
1. SELECT 작업이 INSERT/UPDATE/DELETE 작업보다 훨씬 빈번하게 이뤄지는 테이블에 인덱스를 사용해야 합니다. 인덱스는 결국 조회(검색) 성능을 높이기 위해 사용되는 것입니다. 데이터가 빈번하게 삽입되고, 수정되고, 삭제되는 테이블에 인덱스를 무분별하게 사용하면, 페이지 분할 이슈 등으로 데이터베이스의 성능이 되려 저하될 수 있습니다.
2. WHERE 절에 조건으로 자주 사용되는 컬럼에 인덱스를 생성해야 합니다. 검색 조건에 드물게 사용되는 컬럼에 인덱스를 생성하면 부작용이 더 클 수 있습니다. 어떤 컬럼의 범위를 조건으로 삼는 경우라면 클러스터형 인덱스가 보조 인덱스보다 유리합니다.
3. JOIN에 사용되는 컬럼에는 인덱스를 생성하는 것이 좋습니다.
4. ORDER BY 절에 자주 사용되는 컬럼에는 클러스터형 인덱스를 생성하는 것이 좋습니다. 새로운 데이터가 삽입되면 클러스터형 인덱스가 생성된 컬럼을 기준으로 데이터가 계속해서 정렬되기 때문입니다.
5. 클러스터형 인덱스를 꼭 쓸 필요는 없습니다. 없는 게 나을 때도 있습니다. DB 관련 책들이나 블로그 포스팅을 읽다 보면 대체적으로 아무 설명 없이 idx 컬럼과 같은 것을 만들고 해당 컬럼에 primary key를 지정하고 보는데, 그것이 오히려 성능을 악화시키는 원인이 될 수도 있습니다. 왜냐하면 클러스터형 인덱스를 지정하면 데이터가 입력될 때마다 그 컬럼의 값을 기준으로 데이터를 정렬하기 때문입니다. 또한 MySQL 서버에 부담을 주는 페이지 분할도 계속 이뤄질 것입니다. 만약 해당 컬럼이 WHERE, JOIN, ORDER BY 등에 자주 사용된다면 효과를 보겠지만, 그렇지 않은 경우라면 primary key를 부여하지 않는 것이 낫습니다.
6. 중복된 데이터가 많이 들어가는 컬럼에 인덱스를 생성하는 것은 효과가 적거나 역효과가 있을 수 있습니다. 예를 들어, 성별 컬럼, 국적 컬럼 등은 중복된 데이터가 많이 들어가는 컬럼들이기 때문에 인덱스를 사용하지 않는 게 낫습니다.
참고자료
[1] 우재남 지음, "이것이 MySQL이다", 한빛미디어(2020)