관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

인덱스 1 - 인덱스의 개념을 파악하자 본문

알고리즘 및 자료 관리/SQL

인덱스 1 - 인덱스의 개념을 파악하자

huenuri 2024. 10. 22. 06:28

지금까지 학습한 SQL만 해도 실무 데이터베이스에서 원하는 정보를 추출하는데 문제는 없다. 하지만 실무에서 사용하는 데이터베이스는 상당히 많은 데이터가 입력되어 있고, 이렇게 용량이 큰 데이터베이스에서 정보를 추출할 경우 많은 시간이 소요된다. 이번 장에서는 이런 문제점을 해결해 주는 인덱스에 대해 살펴보겠다.

인덱스는 SELECT를 사용해서 테이블을 조회할 때 결과를 빠르게 추출하도록 도화주는 기능이다. 지금까지 인덱스가 없어도 별 문제가 없었던 이유는 데이터의 양이 적었기 때문이다.

 

시작하기 전에

인덱스는 데이터를 빠르게 찾을 수 있도록 도와주는 도구로, 실무에서는 인덱스 없이 데이터베이스 운영이 불가능하다. 인덱스에는 클러스터형 인텍스와 보조 인덱스가 있다. 클러스터형 인덱스는 기본 키로 지정하면 자동 생성되며 테이블에 1개만 만들 수 있다. 기본 키로 지정한 열을 기준으로 자동 정렬된다.

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


 

 

 

인덱스의 개념

책의 찾아보기가 있을 경우에는 바로 해당 페이지로 가서 찾을 수 있다. 하지만 찾아보기가 없는 책일 경우에는 어떻게 해야 할까? 책을 첫 페이지부터 열심히 넘겨가며 확인해 보는 수밖에 없다. 

실무에서 운영하는 테이블에서는 인덱스의 사용 여부에 따라 성능 차이가 날 수 있다. 데이터를 찾을 때, 인덱스의 사용 여부에 따른 결과값의 차이는 없다. 단지 시간이 오래 걸릴 뿐이다.


 

 

 

인덱스의 문제점

주의할 점은 인덱스를 제대로 이해하지 못한 채 좋다고 남용하는 것이다. 비타민이 몸에 좋다고 하루에 100알씩 먹는 것과 마찬가지이다.

 

찾아보기에 만들지 않아도 될 단어들이 쌓이면 쓸데 없이 책의 두께만 두꺼워지고, 찾아보기를 사용했는데도 단어를 찾는 시간이 찾아보기를 사용하지 않을 때보다 오히려 더 걸릴 수도 있다.

 

실무에서 운영할 때도 비슷한 일이 발생한다. 필요 없는 인덱스를 만드는 바람에 데이터베이스가 차지하는 공간만 더 늘어나고, 인덱스를 이용해서 데이터를 찾는 것이 전체 테이블을 찾아보는 것보다 느려진다.


 

똑똑한 MySQL

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


 

 

 

인덱스의 장점과  단점

인덱스는 SELECT에서 즉각적인 효과를 내는 빠른 방법 중 하나이다. 적절한 인덱스를 생성하고 인덱스를 사용하는 SQL을 만든다면 기존보다 아주 빠른 응답 속도를 얻을 수 있다.

컴퓨터 입장에서는 적은 처리량으로 요청한 결과를 빨리 얻을 수 있으니 여유가 생기고 추가로 더 많은 일을 할 수 있게 된다. 결과적으로 전체 시스템의 성능이 향상되는 효과도 얻게 된다.

 

인덱스의 장점은 다음과 같다.

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

 

인덱스의 단점은 다음과 같다.

  • 인덱스도 공간을 차지해서 데이터베이스 안에 추가적인 공간이 필요하다.
  • 처음에 인덱스를 만드는 데 시간이 오래 걸릴 수 있다.
  • SELECT가 아닌 데이터의 변경 작업(INSERT, UPDATE, DELETE)이 자주 일어나면 오히려 성능이 나빠질 수 있다.

 

 

 

 

인덱스의 종류

MySQL에서 사용되는 인덱스의 종류는 크게 두 가지로 나뉜다. 클러스터형 인덱스와 보조 인덱스이다. 이 두 개를 쉽게 비교하면 클러스트형 인덱스는 영어사전과 같고, 보조 인덱스는 책 뒤에 찾아보기가 있는 일반적인 책과 같다.

보조 인덱스는 SQL 책과 같이 찾아보기가 별도로 있고, 찾아보기에서 해당 단어를 찾은 후에 옆에 표시된 페이지를 펼쳐야 실제 내용이 있는 것을 말한다. 클러스터형 인덱스는 영어사전처럼 책의 내용이 이미 알파벳 순서대로 정렬되어 있는 것이다. 그래서 별도의 찾아보기가 없고 책 자체가 찾아보기이다.


 

 

 

자동으로 생성되는 인덱스

이제 본격적으로 테이블에 적용되는 인덱스를 살펴보겠다. 인덱스는 테이블의 열 단위에 생성되며, 하나의 열에는 하나의 인덱스를 생성할 수 있다.

 

인터넷 마킷의 회원 테이블(member)을 예로 인덱스를 살펴보겠다.

열 하나당 인덱스를 생성하면 이 테이블에는 우선 8개의 서로 다른 인덱스를 생성할 수 있다. member 정의 시 회원 아이디를 기본 키로 정의했다. 이렇게 기본 키로 지정하면 자동으로 mem_id 열에 클러스터형 인덱스가 생성된다. 하지만 기본키는 테이블에 하나만 지정할 수 있기에 클러스터형 인덱스는 테이블에 한 개만 만들 수 있다.

 

 

 

 

이제 테이블의 인텍스를 확인해보자. SHOW INDEX 문을 사용하면 인덱스 정보가 확인된다.

Key_name 부분을 보면 PRIMARY 기본 키로 설정된 것을 확인할 수 있다. Column_name이 col1으로 설정되어 있는 것은 col 열에 인덱스가 만드어져 있다는 말이다. Non_Unique는 고유하지 않다는 뜻으로, 중복이 허용된다는 뜻이다. 0은 False, 1은 True의 의미이다. 결론적으로 이 인덱스는 중복이 허용되지 않는 인덱스이다.

 

기본 키와 더불어 고유 키도 인덱스가 자동으로 생성된다. 고유 키로 생성되는 인덱스는 보조 인덱스이다. 두 번째와 세 번째 열은 UNIQUE로 지정했다.

 

 

고유 키 역시 중복값을 허용하지 않기 때문에 Non_unique가 0으로 되어 있다. 보조 인덱스도 여러 개 만들 수 있다.


 

 

 

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

이번에는 클러스터형 인덱스의 특징을 파악해 보겠다. 앞서 클러스터형 인덱스를 영어사전과 비교 설명했다. 영어사전의 가장 큰 특징은 단어가 알파벳 순서로 정렬되어 있다는 것이다. 마찬가지로 어떤 열을 기본 키로 지정하면 그 열을 기준으로 자동 정렬된다.

 

 

결과는 입력한 순서대로 출력되었다. 이제 mem_id 열을 기본 키로 설정하고 내용을 확인해 보자.

 

 

알파벳 순서로 정렬이 되었다.

 

 

 

이번에는 mem_id 열의 Primary Key를 제거하고, mem_name 열을 Primary Key로 지정해 볼 것이다. 비유하자면 영한사전을 한영사전으로 변경한 개념이다.

 

 

결과는 변함없으나 한글 순으로 정렬된 것을 볼 수 있다.

 

 

지금부터는 추가로 데이터를 입력하면 기준에 맞춰 정렬된다.


 

 

 

기본 키 변경 시 주의사항

이미 대용량의 데이터가 있는 상태에서 기본 키를 지정하면 시간이 엄청 오래 걸릴 수 있다. 노트에 단어가 4개라면 정렬하는데 금방이지만, 단어가 4만 개라면 그것을 정리하는데 오랜 시간이 걸린다.

앞에서 회원 이름을 기본 키로 변경했는데, 실제라면 논리적으로 위험하다. 기본 키는 중복되지 않아야 하지만 회원 이름은 중복될 수 있기 때문이다.


 

 

 

정렬되지 않는 보조 인덱스

고유 키로 지정하면 보조 인덱스가 생성된다. 그리고 보조 인덱스는 테이블에 여러 개 설정할 수 있다. 보조 인덱스는 일반 책으로 비유한다. 일반 책에 찾아보기를 만들면 책의 뒤에 추가되는 것이지 책의 본문이 변경되는 것은 아니다.

책에 이와 같은 동물 관련 단어의 찾아보기를 넣는다고 해서 본문의 순서나 내용이 바뀌지 않는다.

 

 

 

 

입력한 순서대로 결과가 출력되었다. 이제 mem_id 열을 고유 키로 설정하고 내용을 확인해 보자.

 

보조 인덱스를 사용해도 데이터의 내용이나 순서는 변경되지 않는다.

 

 

이번에는 mem_name 열에 추가로 고유 키를 지정해 보겠다. 고유 키는 여러 개 설정해도 되므로 기존 고유 키를 제거할 필요는 없다. 기존에 '동물'과 관련된 찾아보기는 그대로 있고, 추가로 '식물'과 관련된 찾아보기를 만드는 것이다.

 

 

이제 여기에 추가로 데이터를 입력해 볼 것이다. 일반 책에 새로운 내용이 추가되면 본문의 제일 뒤에 추가되는 것과 같다.

 

소녀시대가 순서와 관계없이 맨 뒤에 추가되었다. 보조 인덱스는 여러 개 만들 수 있다. 하지만 보조 인덱스를 만들 때마다 데이터베이스의 공간을 차지하게 되고, 전반적으로 시스템에 나쁜 영향을 미치게 된다. 그러므로 꼭 필요한 열에만 적절히 보조 인덱스를 생성하는 것이 좋다.


 

 

 

 

단원 마무리하기

 

 

 

 

 

 

 


 

 

 

 

학습을 마치고

인덱스가 무엇인지 개념을 확실히 파악할 수 있는 단원이었다. 그리고 목표한 대로 1시간 반 만에 강의를 듣고 내용을 정리하고 실습을 진행했다. 이틀 동안 수학 공부를 하지 못했는데 오늘은 꼭 아침 공부 시간을 지나서라도 목표했던 분량을 마치려고 한다.

인덱스도 생각보다 어렵지 않고 재미있는 개념이었다.