공부기록
인덱스 본문
- 인덱스
- 인덱스는 데이터 레코드를 빠르게 접근하기위해 <key : pointer> 쌍으로 구성되는 데이터 구조이다.
- 인덱스는 데이터가 저장된 물리적 구조와 밀접한 관련이 있다.
- 인덱스는 레코드가 저장된 물리적 구조에 접근하는 방법을 제공
- 레코드의 삽입과 삭제가 수시로 일어나는 경우, 인덱스의 갯수를 최소로 하는 것이 효율적이다.
- 인덱스가 없으면 특정한 값을 찾기 위해 모든 데이터 페이지를 확인하는 TABLE SCAN이 발생한다.
- Table Scan
- 테이블에 있는 모든 레코드를 순차적으로 읽는 것
- Table Scan
- 기본키를 위한 기본 인덱스, 기본 인덱스가 아닌 인덱스를 보조 인덱스라고 한다.
- 대부분의 상용 DBMS에선 기본 키에 대해 자동적으로 기본 인덱스를 생성
- 클러스터드 인덱스 / 넌클러스터드 인덱스
- 클러스터드 인덱스
- 인덱스 키의 순서에 따라 데이터가 정렬되어 저장되는 방식
- 실제 데이터가 순서대로 저장되어 있어 인덱스를 검색하지 않아도 데이터를 빠르게 찾을 수 있다.
- 데이터 삽입, 삭제 발생시 순서를 유지하기 위해 데이터를 재정렬 해야한다.
- 한 개의 관계에 한 개의 인덱스만 생성이 가능
- 넌클러스터드 인덱스
- 인덱스의 키 값만 정렬되어 있을 뿐 실제 데이터는 정렬되지 않는 방식
- 데이터를 검색하기 위해 인덱스를 검색하여 실제 위치를 확인해야함, 클러스터 인덱스보다 검색 속도가 떨어짐
- 한 개의 릴레이션에 여러 개의 인덱스를 만들 수 있다.
- 클러스터드 인덱스
- B+ 트리 인덱스
- 인덱스를 저장하는 블록들이 트리 구조를 이룸
- 상용 DBMS에선 B+ 트리 인덱스를 주로 사용
- 단말 노드가 아닌 인덱스 세트와 단말 노드인 순차세트로 구분
- 인덱스 세트의 노드들은 단말 노드에 있는 키 값만 찾아갈 수 있도록 제공
- 순차 세트의 단말 노드들이 해당 데이터 레코드의 주소를 가리킴
- 인덱스 세트에 있는 모든 키 값들이 단말 노드에 다시 나타나므로 단말 노드만 이용한 순차 처리가 가능
- 인덱스 대상 테이블 선정 기준
- 테이블의 크기가 Multi Block Read 수 이상일 경우 인덱스가 필요
- multi block read란 테이블 엑세스 시 메모리에 한 번에 읽어 들일 수 있는 블록의 수를 말한다.
- 랜덤 엑세스가 빈번한 테이블
- 특정 범위나 특정 순서로 데이터 조회가 필요한 테이블
- 다른 테이블과 순차적 조인이 발생되는 테이블
- 테이블의 크기가 Multi Block Read 수 이상일 경우 인덱스가 필요
- 인덱스 대상 컬럼 선정 기준
- 인덱스 컬럼의 분포도가 10~15% 이내인 컬럼
- 분포도 = (컬럼값의 평균 row 수 / 테이블의 총 row 수) * 100
- 분포도가 10~15% 이상이어도 부분 처리를 목적으로 하는 칼럼
- 입출력 장표 등에서 조회 및 출력조건으로 사용되는 칼럼
- 인덱스가 자동 생성되는 기본키와 Unique키 제약 조건을 사용한 칼럼
- 가능한 한 수정이 빈번하지 않은 칼럼
- 분포도가 좁은 칼럼은 단독 인덱스로 생성
- ORDER BY, GROUP BY, UNION이 빈번한 칼럼
- 인덱스들이 자주 조합되어 사용되는 경우 하나의 결합 인덱스로 생성
- 인덱스 컬럼의 분포도가 10~15% 이내인 컬럼
- INDEX SQL
- 인덱스 생성
- create [unique] index 인덱스명
- on 테이블 명(속성명 [asc | desc] [, 속성명[asc|desc]])
- [cluster]
- 인덱스 사용
- select (attributes) from (index_name) where (predicates)
- 인덱스 삭제
- drop index (index name);
- 인덱스 생성
더보기
인덱스?
인덱스는 저장공간을 따로 할당하여 정보를 빠르게 검색할 수 있도록 하는 자료구조를 말한다.
인덱스는 create할 때 새로 항목을 추가하고
update할 때 기존 항목을 사용안함 처리하고 새롭게 항목을 추가하고
delete할때 해당 항목을 사용안함 처리한다.
따라서 create, update, delete가 잘 일어나지 않는 칼럼에 적합하다.
또한 group by, order by가 자주 일어나는 칼럼에 적합하다.
데이터 중복도가 낮은 칼럼에 적합하다.
규모가 큰 테이블에 적합하다.
자료구조는 b+ 트리를 사용한다.
create index my_index on table(column1, column2)
select * from my_index where (predicates)
drop index my_index;
- 출처