index를 어느 column에 사용하는 것이 좋을까?

SOL·2023년 4월 6일
0

db

목록 보기
3/4
post-custom-banner

인덱스는 어떻게 데이터를 빠르게 검색하도록 도와줄까?

인덱스를 생성하면, 해당 column에 대한 정렬된 키-값 쌍을 생성한다. 이 키-값 쌍은 인덱스 테이블에 저장되며, 이 테이블은 빠른 검색을 위해 메모리에 로딩되거나 디스크에 저장된다. 는 인덱스 column의 값이 저장되며, 으로는 해당하는 레코드의 위치 정보가 저장된다.

 

답변을 하기 위해, 선택도카디널리티의 개념을 알아야한다.

선택도

  • 데이터베이스에서 쿼리를 실행할 때, 조건절에서 선택된 레코드(row)의 비율을 나타내는 지표
  • 조건절에서 선택된 레코드 수 / 전체 레코드 수
    -> 0부터 1까지의 값을 가지며, 0에 가까울수록 조건절에서 선택되는 레코드 수가 적고, 1에 가까울수록 선택되는 레코드의 수가 많다는 것을 의미

카디널리티(Cardinality)

  • 데이터베이스에서 테이블의 컬럼이 가지는 고유한 값의 개수를 나타내는 지표
  • 컬럼의 중복되지 않는 값의 개수
    -> 예를 들어, 성별을 나타내는 컬럼의 경우, '남성'과 '여성' 두 가지 값만을 가지므로 카디널리티는 2

 

모든 컬럼에 인덱스를 사용하면 성능이 더 좋을까?

인덱스를 생성하는 것은 디스크 공간을 차지하고, 쿼리 수행 시 인덱스를 스캔하는 작업이 추가되어야 하기 때문에 성능에 영향을 줄 수 있다. 인덱스는 별도의 저장 공간을 차지하므로, 모든 컬럼에 인덱스를 생성하는 것은 데이터베이스 용량을 크게 증가시킬 수 있다.

 

성별 컬럼에 index를 걸어주는 게 좋을까?

  • 성별 컬럼 = 데이터의 중복도가 높아 카디널리티가 낮은 컬럼이다.
    카디널리티가 낮은 컬럼은 검색 결과가 크게 줄어들지 않기 때문에 인덱스를 걸어주는 것은 일반적으로 성능에 큰 도움이 되지 않는다. 차라리 테이블을 전체 스캔하는 것이 더 효율적일 수 있다.

 

true 또는 false 값을 갖는 column에서, index를 거는게 좋을까?

만약 true 값의 비율이 매우 작고, true 값으로 검색하는 쿼리가 자주 수행한다면, 해당 컬럼에 인덱스를 추가하는 것이 유용할 수도 있다. 하지만, 이 경우 인덱스가 차지하는 용량과 인덱스를 업데이트하느 ㄴ비용이 불필요하게 높아질 수 있다.

 

결론

1. 자주 조회되는 column(조인되는 column)

인덱스는 데이터베이스에서 데이터를 빠르게 검색하기 위해 사용됩니다. 따라서 인덱스를 생성할 column은 데이터베이스에서 자주 검색되는 column 이어야 합니다. 마찬가지로, 자주 조인되는 column은 다른 테이블에서 자주 검색되는 column 이므로 인덱스를 생성하는 것이 성능 향상에 큰 도움이 됩니다.

2. 선택도가 낮은 column

선택도가 높은 column은 조건절에서 매우 많은 레코드가 선택될 가능성이 있습니다. 이러한 경우 인덱스를 사용하더라도 많은 레코드가 선택되므로 인덱스 검색에 대한 성능 향상 효과가 미비합니다.

3. 카디널리티가 높은 column

카디널리티가 낮은 column에 인덱스를 생성하면, 해당 column의 값이 많이 중복되므로 인덱스를 사용하더라도 많은 레코드가 선택됩니다.

4. 수정 빈도가 낮은 column

수정 작업 시 인덱스를 갱신해야 하므로 데이터베이스의 성능을 저하시킬 수 있습니다. 또한, 수정 작업 시 인덱스 갱신에 따른 추가적인 로그 및 저장 공간이 필요하므로, 데이터베이스 용량도 증가할 수 있습니다.

post-custom-banner

0개의 댓글