CS/DB

[혼공SQL] 인덱스의 개념

F12:) 2024. 1. 30. 16:53

   인덱스의 개념

인덱스는 마치 우리가 책 뒷 부분에서 볼 수 있는 찾아보기와 같다.

 

개인 프로젝트와 같이 데이터의 양이 적은 상황에서는 인덱스의 효과를 체감할 수 없지만, 대량의 데이터를 다루는 곳에서는 인덱스가 필수적이다.

 

인덱스에는 클러스터형 인덱스보조 인덱스가 있다.

 

클러스터형 인덱스기본키로 지정하면 자동 생성되며 테이블에 1개만 만들 수 있다. 기본키로 지정한 열을 기준으로 자동으로 정렬되기 때문에, 효과적으로 데이터를 찾을 수 있는 것이다.

보조 인덱스고유 키로 지정하면 자동 생성되며 여러 개를 만들 수도 있지만 자동 정렬되지는 않는다.

 

  인덱스의 단점

인덱스를 무작정 남용한다고 해서 좋지만은 않다. 예를 들면 SQL문으로 쓰여진 책이 있는데, 해당 책에서 SELECT문을 '찾아보기'를 통해 찾고자 한다. 아마 거의 모든 SQL문에는 SELECT가 있을 것이므로 '찾아보기'에서는 많은 SELECT가 쓰여져있을 것이며, 우리는 '찾아보기'를 한번 확인하여 페이지를 확인하고 해당 페이지로 가서 한번 더 확인해야하는 번거로움을 겪는다.

 

이런 과정을 반복하게 되면, 실제 처음부터 본문에서 찾는 것보다 더 느리게 찾을 수도 있으며 책의 두께가 두꺼워질 수 있다.

 

이게 인덱스의 단점이다. 무자비한 인덱스의 사용은 데이터베이스의 용량이 늘어나고, 인덱스를 활용해 데이터를 찾는 시간이 인덱스 없이 데이터를 찾는 시간보다 더 오래 걸리게 될 수 있다.

 

MySQL에서는 인덱스를 사용한 것과 인덱스를 사용하지 않는 것의 시간차를 고려하여 유연하게 두 가지 방식 중에 하나를 선택해준다. 따라서 인덱스를 남용하여, MySQL 판단 하에 인덱스를 사용하지 않는 것이 좋다고 하게되면 인덱스를 무용지물이 되며 의미없이 용량만 차지하는 꼴이 된다.

 

  인덱스의 장단점

장점

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

 

단점

  • 인덱스는 공간을 차지하므로 데이터베이스 안에 추가적인 공간이 필요함.
  • 처음 인덱스를 만드는 데 시간이 오래 걸릴 수 있음.
  • SELECT가 아닌 INSERT, UPDATE, DELETE와 같은 작업이 많이 실행되면 오히려 성능이 나빠질 수 있음.

 

   인덱스의 종류

인덱스는 크게 클러스터 형 인덱스와 보조 인덱스로 나뉜다. 클러스터형 인덱스는 마치 영어 사전과 같다. 그 자체로 '찾아보기'의 기능을 하는 것이다. 보조 인덱스는 책 뒤의 찾아보기와 같다.

 

  자동으로 생성되는 인덱스

하나의 열에는 최대 하나의 인덱스를 생성할 수 있음.

 

그 중, PK로 지정하면 자동으로 등록되는 인덱스가 바로 클러스터형 인덱스이다. 따라서 테이블에서는 클러스터형 인덱스가 최대 1개이다.

 

인덱스를 만들었으면 아래의 SQL문으로 테이블의 인덱스 정보를 출력할 수 있다.

SHOW INDEX FROM table1;

 

예시로 아래와 같이 출력될 수 있다.

Table Non_unique Key_name Seq_in_index Column_name Collation ... Null Index_type
table1 0 Primary 1 col1 A     BTREE

 

 

여기서 Key_name에 Primary라고 되어있는데 이는 PK를 의미하며, pk의 설정에 의해 '자동으로 생성된 인덱스'라는 의미이다. 즉, 클러스터형 인덱스를 의미한다.

 

Column_name이 col1로 설정되어 있다는 것은, col1 열에 인덱스가 만들어져있다는 뜻.

 

Non_unique가 0인 것은 Non_unique = false를 의미하고 1이면 true이다. 즉, 고유하지 않은 것이 거짓이므로 고유하다는 뜻이 된다. PK는 고유하기 떄문이다.

 

더보기

  고유 인덱스

 

고유 인덱스는 인덱스의 값이 중복되지 않는다는 뜻이다. 이와 반대되는 것이 단순 인덱스이다.

PK나 UNIQUE로 지정하게 되면 값이 중복되지 않으므로 고유 인덱스가 생성됨. 그 외에는 단순 인덱스로 생성됨.

 

고유 키 또한 인덱스가 자동으로 생성됨. 고유 키로 생성되는 인덱스는 보조 인덱스임.

 

 

  자동으로 정렬되는 클러스터형 인덱스

클러스터형 인덱스는 기본키로 지정하면 자동으로 생성되며, 클러스터형으로 지정 시 해당 열의 데이터가 자동 정렬된다.

 

아래와 같은 테이블에 데이터가 있다고 해보자.

mem_id mem_name mem_number addr
TWC 트와이스 9 서울
BLK 블랙핑크 4 경남
WMN 여자친구 6 경기
OMY 오마이걸 7 서울

 

이 데이터에 이제 PK를 mem_id에 지정하게 된다면, mem_id의 값 기준으로 정렬된다.

ALTER TABLE member
	ADD CONSTRAINT
    PRIMARY KEY (mem_id);

 

그러면 아래와 같은 순서로 출력될 것이다.

mem_id mem_name mem_number addr
BLK 블랙핑크 4 경남
OMY 오마이걸 7 서울
TWC 트와이스 9 서울
WMN 여자친구 6 경기

 

 

  정렬되지 않는 보조 인덱스

보조 인덱스는 고유 키로 지정하면 자동으로 생성된다. 하지만 보조 인덱스는 '찾아보기'로 예시를 든 것처럼 출력 결과(책의 본문)에는 직접적인 영향을 끼치지 않는다.

 

따라서 보조 인덱스를 아무리 추가해도 결과에는 변동이 없다. 또한 UNIQUE는 여러 열에 생성할 수 있듯이 보조 인덱스는 한 테이블에 여러 개 존재할 수 있다.

 

다만, 꼭 필요한 열만 지정해주어, 데이터베이스에서 많은 크기를 차지않도록 함에 주의하자.

 

'CS > DB' 카테고리의 다른 글

[혼공SQL] 인덱스 사용 SQL  (0) 2024.02.01
[혼공SQL] 인덱스 내부 작동  (1) 2024.02.01
[혼공SQL] 뷰  (0) 2024.01.29
[혼공SQL] 제약 조건  (0) 2024.01.29
[혼공SQL] 혼공단 11기 - 4주차 미션 인증  (0) 2024.01.28