인덱스를 효과적으로 사용하는 방법

Hoo-Sung.Lee·2024년 1월 21일
0

Database

목록 보기
10/18

인덱스는 열 단위에서 생성됩니다.
하나의 열에 기본적으로 하나의 인덱스를 생성할 수 있습니다.

물론 하나의 열에 2개 이상의 인덱스를 만들 수 있고, 2개 이상의 열을 묶어서 하나의 인덱스로 만들 수 있습니다.(복합 인덱스)


인덱스를 효과적으로 사용하는 방법

1. WHERE 절에서 사용되는 열에 인덱스를 만들어야 합니다.

select mem_id, mem_name, mem_number, addr
	from member
   	where mem_name = '에이핑크';

만약 member 테이블에서 단지 이 SQL만 사용한다고 가정하면, 이 SQL에서 mem_id, mem_number,addr 열에는 인덱스를 생성해도 전혀 사용되지 않습니다. WHERE절에서는 mem_name열의 인덱스만 사용합니다. 그러므로 다른 열에 인덱스를 만드는 것은 낭비가 됩니다.

2. WHERE절에 사용되더라도 자주 사용해야 가치가 있습니다.

만약 mem_name열에 인덱스를 생성해서 효율이 좋아진다라고 해도, 이 SELECT문은 1년에 몇 사용이 안되고, member 테이블에는 주로 INSERT작업만 일어난다고 가정하면, 인덱스는 INSERT의 성능을 안좋게 하므로 오히려 인덱스에 인해서 성능이 나빠지는 결과가 될 것입니다. 이런 경우는 그냥 인덱스 없이 SELECT 하는 것이 좋습니다.

3. Cardinality가 낮은(중복도가 높은) 열은 인덱스를 만들어도 별 효과가 없습니다.

열에 들어갈 데이터의 종류가 몇가지 되지 않으면 인덱스는 큰 효과를 내지 못합니다. 예를 들어 Cardinality가 낮은(중복도가 높은) 성별, 연락처 국번, 주로 사용하는 교통수단 등 종류가 제한된 것에는 인덱스를 만들어도 효과가 없습니다.

3. 클러스터형 인덱스는 테이블당 하나만 생성할 수 있습니다.

클러스터형 인덱스는 데이터 페이지를 읽는 수가 보조 인덱스보다 적기 때문에 성능이 우수 합니다. 그러므로 하나밖에 지정하지 못하는 클러스터형 인덱스(기본 키)는 조회할 때 가장 많이 사용되는 열에 지정하는 것이 효과적입니다.

4. 사용하지 않는 인덱스는 제거합니다.

실제로 사용되는 SQL을 분석해서 WHERE 조건에서 사용되지 않는 열의 인덱스를 제거할 필요가 있습니다.


인덱스의 장점

인덱스를 사용하는 SQL을 만든다면 기존보다 아주 빠른 응답 속도를 얻을 수 있습니다.

  • SELECT문으로 검색하는 속도가 매우 빨라집니다.
  • 그 결과 컴퓨터의 부담이 줄어들어 결국 시스템의 성능이 향상됩니다.

인덱스의 단점

과도하게 많은 인덱스를 만들면 데이터베이스가 차지하는 공간만 더 늘어나고, 이럴 경우에는 인덱스를 이용해서 데이터를 찾는 것이 전체 테이블을 찾아보는 것보다 느려집니다.

데이터베이스에 인덱스를 생성해 놓아도, 인덱스를 사용해서 검색하는 것이 빠를지 아니면 전체 테이블을 검색하는 것이 더 빠를지는 MySQL이 알아서 판단합니다. 만약 인덱스를 사용하지 않는다면, 사용하지도 않는 찾아보기를 만든것이므로 쓸데없이 공간을 낭비한 것입니다.

  • 인덱스도 공간을 차지해서 데이터베이스 안에 추가적인 공간이 필요하다.

    인덱스는 대략 테이블 크기의 10%정도의 공간이 추가로 필요합니다.

  • 처음에 인덱스를 만드는 데 시간이 오래 걸릴 수 있습니다.

    찾아보기가 없는 책에 새로 찾아보기를 만드는 것과 마찬가지로 작업 시간이 필요합니다.

  • SELECT가 아닌 데이터의 변경 작업(INSERT,UPDATE,DELETE)이 자주 일어나면 오히려 성능이 나빠질 수 있습니다.

  • 인덱스가 있는 테이블에서 데이터를 삽입, 수정, 삭제할 때마다 해당 인덱스도 업데이트 되어야 합니다. 따라서 이러한 작업이 빈번하게 발생하면 인덱스 유지에 추가적인 오버헤드가 발생하게 됩니다.


Remind
보조 인덱스는 자동으로 생성되지 않으나, UNIQUE 제약 조건이나 FORIEGN KEY 제약 조건을 추가할 때 자동으로 생성 될 수 있습니다.

profile
Working towards becoming Backend-Developer

0개의 댓글