Index :
검색속도를 높이기 위해 사용하는 기술.
INDEX 는 색인이다. 해당 TABLE의 컬럼을 색인화하여 검색시 해당 TABLE 의 레고드를 Full Scan 하는게 아니라 색인화 되어있
INDEX 파일을 검색하여 검색속도를 빠르게한다.
책에 있는 목차라고 생각하면 된다.
이런 INDEX 는 TREE 구조로 색인화 한다 .
RDBMS 에서 사용하는 INDEX 는 Balance Search Tree 를 상용한다.
실제로는 B-Tree 에서 파생된 B+Tree 를 사용한다.
Oracle, MySQL에서는 여러종류의 TREE를 선택하여 사용 가능하다.
B-Tree 란 이진노드를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조이다.
정렬된 상태로 보관하고, 삽입 및 삭제를 대수 시간으로 할 수 있다.
탐색방식은 이진 탐색 트리와 동일한 방식으로 수행된다 , 루트에서 시작하여 하향식으로 탐색대상의 값을 구분 갑솨 비교하며
자식 포인터를 찾아가는 과정으로 진행한다.
B_TREE 인덱스는 칼럼의 값을 변형하지 않고, 원래의 값을 이용해 인덱싱하는 알고리즘이다.
장점
-인덱스 테이블 스캔시 인덱스 테이블은 데이터들이 정렬되어 저장되어 있기 때문에 해당 조건 (where)에 맞는
데이터들을 빠르게 찾아 낼 수 있다. 이것이 인덱스를 사용하는 가장 큰 이유다.
- INDEX 사용시 이미 정렬이 되어 있기 때문에 Sort 과정을 피할 수 있다 .
Order By 는 굉장히 부하가 많이 걸리는 작업이다. 정렬과 동시에 1차적으로 메모리에서 정렬이 이루어지고
메모리 보다 더 큰 작업이 필요하다면 추가적으로 발생한다. 인덱스를 사용하면 이미 정렬이 되어 있기 때문에 가져오기만 하면 된다.
- 최댓값과 최솟값도 가져오기 쉽다.
단점
- 정렬 된 상태를 계족 유지 시켜줘야 하기 때문에 레코드 내에 데이터 값이 바뀌어도 영향이 미치고
insert, update, delete 를 하면 바뀐 데이터들도 다시 정렬해줘야 한다.
값이 바뀐다면 INDEX 테이블 내에 있는 값들도 다시정렬하고, 원본 테이블도 정렬해줘야한다.
언제 생성해 ???
- 데이터의 분포도가 최대한이고 조건절에 호출이 자주 되는 컬럼을 인덱스로 생성하는것이 좋다.
인덱스는 특정 컬럼을 기준으로 생성하고 기준이 된 컬럼으로 정렬된 INDEX 테이블이 생성된다.
1. 조건절에 자주 등장하는 컬럼
2. 항상 = 으로 비교되는 컬럼
3. 중복되는 데이터가 최소한인 컬럼
4. order by 에서 자주 사용되는 컬럼
5. 조인 조건으로 자주 사용되는 컬럼
인덱스를 사용하면 무조건 좋을까 ??
인덱스를 관리하기 위해서는 데이터베이스 의 약 10%에 해당하는 저장공간이 추가로 필요하다고 한다.
인덱스 설계 x
대용량 데이터가 자주입력되는 경우, 데이터 중복도가 높은경우, 자주 사용하지 않는경우
인덱스의 종류
primary : 중복되지 않는 유일한 키
normal : 중복허용 인덱스
unique : 중복허용하지않는 유일한 키
foreign: 다른 테이블과의 관계성을 부여하는 키
full text: 자연어 검색
클러스터 인덱스는 처음부터 정렬이 되어 있는 영어사전 같은느낌이고
보조 인덱스(논클로스터)는 책 뒤에 찾아보기 같은 개념이다.
클러스터 인덱스란 : 특정 나열된 데이터들을 일정 기준으로 정렬해 준다.
>> 인덱스 생성시 데이터 페이지 전체가 다시 정렬된다.
>> 인덱스 생성시 시스템 부하를 줄 수 있다.
>> 한개의 테이블에 한개씩 만들 수 있다 . (Primary Key)
클러스터 인덱스는 따로 저장하는 정보 공간을 적게 사용하면서 테이블 고간 자체를 활용한다.
검색 속도는 빠르지만 , 입력/수정/삭제 는 더 느리다.
인덱싱을 하면 루트페이지가 만들어진다
루트페이지 란 각 데이터의 첫번째 데이터만 다와서 매핑한다.
데이터 페이지는 자동정렬이 된다.
보조 인덱스
개념적으로 후보키에만 부여 할 수 있는 인덱스다. 최소한의 고유 식별 속성 집합
보조 인덱스 역시 루트 페이직 만들어 지지만, 데이터 페이지에 바로 연결시키지 않고
보조 인덱스 생성시 별도의페이지 에 인덱스를 구성한다 (RID)
>> 정렬 하지 않는다.
>> 리프 페이지는 데이터가 아니라 데이터의 주솟값이 들어간다.
>> 여러개 생성가능하다.
각 데이터에 대해 고유 값 들이 있는 목록을 생성할수 있는 인덱스다.
데이터 페이지의 변화를 주지 않아 , 여러개 생성이 가능하다.
삽입 면에서 페이지 빈곳에 데이터를 넣고 리프 페이지에 매핑만 하면 되기때문에 페이지 분할
삽입 면에서 이점을 가지지만, 조회에서는 불리하다.
테이블에 등록된 인덱스 확인
SHOW INDEX FROM '테이블명'
테이블의 열에 개인키(Primary Key)를 설정하면 자동으로 해당 열에 클러스터형 인덱스가 생성됩니다. 그리고 클러스터형 인덱스가 있는 개인키(Primary Key)열에 의해 오름차순(Default)으로 정렬된다.
인덱스는 카디널리티 (Cardinality) 가 높은 컬럼에 지정하는 게 좋다,
카디널리티가 높다는 말은 데이터의 중복이 적다
댓글