주제
목차
내용
인덱스(INDEX)란?
사전의 색인과 똑같이 원하는 데이터의 위치를 빠르게 찾아주는 역할을하는 DB 자료구조입니다.

인덱스가 잘 설정되었을 경우 조회 성능을 크게 높일 수 있습니다. 하지만 인덱스를 설정했더라도 인덱스의 효과를 받지 못할 경우도있습니다.
Index의 종류
- Clustered Index(클러스터 인덱스)
- 테이블 당 한개만 생성이 가능
- 기본키를 생성하면 자동으로 클러스터 인덱스를 생성
- 물리적으로 행을 재배열
- 데이터 입력, 수정, 삭제 시 항상 정렬상태를 유지
- 넌 클러스터 인덱스보다 검색 속도는 빠르다. 입력,수정, 삭제는 느리다.
- 30% 이내에서 사용해야 좋은 선택도를 가진다.
10분 테코톡을 보다보니 이런 사실을 알게 되었습니다.
요즈음 이메일을 로그인할 때 사용하다 보니 이메일을 유저 테이블의 PK로 사용할 수 있겠지만 이메일을 PK로 지정하는 경우 클러스터드 인덱스가 생성되고, 새로운 계정이 생성될 때 사전순으로 어디에 들어갈지 모릅니다. 그러므로 계정이 생성될 때마다 인덱스 재배열이 일어나게 됩니다.
PK가 Auto Increment 같은 시퀀셜한 Key일 경우에는 인덱스의 재배열이 일어나지 않아도 되므로 email을 PK로 지정하기보다는 유니크 key로 두고 별도의 시퀀스를 PK로 가져가는 것이 좋습니다.
- NonClustered Index(넌 클러스터 인덱스)
- 테이블당 약 240개의 인덱스를 만들 수 있다.
- 유니크 제약조건으로 컬럼을 생성하면 자동 생성
- 인덱스 페이지는 로그파일에 저장된다.
- 레코드의 원본은 정렬되지 않고 인덱스 페이지만 정렬된다.
- 인덱스 자체의 리프 페이지는 데이터가 아니라 데이터가 위치하는 포인터이기 때문에 클러스터형 보다 검색속도는 더 느리지만 입력, 수정, 삭제는 더 빠르다.
- 별도의 인덱스 페이지를 따로 만들기 때문에 용량을 더 차지한다.
- 3% 이내에서 사용해야 좋은 선택도를 가진다.
인덱스 설정/사용 시 고려 사항
- 인덱스는 별도의 저장공간이 필요합니다.
데이터의 양과 인덱스 생성에 필요한 저장공간은 비례하므로 무작정 많이 설정한다고해서 좋기만한 것은 아닙니다.
- 인덱스는 입력,수정, 삭제가 발생하면 갱신됩니다.
그러므로 인덱스는 최대한 입력, 수정, 삭제가 발생하지 않고, 조회가 잦은 테이블에 적용해야합니다.
- 인덱스는 조회 성능을 향상 시키기 위해 사용됩니다.
그러므로 조건절(WHERE, JOIN ON)에 인덱스가 포함된 컬럼이 들어가야 효과를 볼 수 있습니다.
또한 조건절(WHERE, JOIN ON)에 많이 사용될수록 인덱스의 효과가 극대화 될 것입니다.
- 인덱스는 중복이 적은 컬럼에 적용하는 것이 유리합니다.
컬럼의 값에 따라 인덱스가 지정되고, 인덱스를 통해 특정 컬럼 값을 찾습니다.
그러므로 중복이 많을수록 인덱스로 하나의 데이터를 특정하기 어렵습니다.
카디널리티, 선택도를 통해서 얼마나 데이터들이 중복되는지 알 수 있습니다.
- 카디널리티 : 특정 데이터 집합의 유니크한 값의 개수, 높을 수록 중복도가 낮다.

위와 같은 테이블에서 레코드의 총 개수는 6개
age컬럼의 카디널리티는 김형욱과 박진형이 중복되므로 5입니다. 만약 중복이 더 많이 일어난다면 카디널리티가 낮아질 것 입니다.
- 선택도 : 데이터 집합에서 특정 값을 얼마나 잘 골라낼 수 있는지에 대한 지표
Selectivity = Cardinality / Total Number Of Records
즉 위 테이블의 선택도는 5/6 = 83.3% 입니다. 만약 중복이 더 많이 일어난다면 선택도는 점점 낮아질 것 입니다.